Java套接字一直卡住

标签 java android sockets serversocket

我正在尝试实现一个简单的服务器(java 应用程序)和客户端(android 应用程序),其中客户端每秒发送大约 10 次字符串。一分钟左右一切正常,之后服务器停止接收来自客户端的消息。相关代码如下。

ClientThread.java

public class ClientThread implements Runnable{
static Socket socket;
static String message = "";
InetAddress serverAddr;
BufferedOutputStream bos;

public ClientThread(String message){
    ClientThread.message = message;
}

@Override
public void run() {
    try{
        serverAddr = InetAddress.getByName(SERVER_IP);
        if(socket != null && socket.isConnected())socket.close();
        socket = new Socket(serverAddr, SERVER_PORT);
        bos = new BufferedOutputStream (socket.getOutputStream());
        OutputStreamWriter osw = new OutputStreamWriter(bos, "US-ASCII");
        osw.write(message);
        osw.flush();
        socket.shutdownOutput();
        socket.close();
    }catch (Exception e) {
    }
}
}

ServerThread.java

public class ServerThread extends Thread{
    private ServerSocket serverSocket;
    static String clientSentence;

   public ServerThread(int port) throws IOException, AWTException{
      serverSocket = new ServerSocket(port);
   }

   public void run() {
      while(true){
         try{
            Socket server = serverSocket.accept();
            BufferedReader d = new BufferedReader(new InputStreamReader(server.getInputStream()));
            clientSentence = d.readLine();
            System.out.println(clientSentence);
            server.close();
         }catch(IOException e){
            e.printStackTrace();
            break;
         }
      }
   }
}

ClientThread.java 每秒被调用大约 10 次,使用:

Thread clientThread = new Thread(new ClientThread(message));
clientThread.start();

ServerThread.java 已初始化并开始使用:

t = new ServerThread(8888);
t.start();

关于为什么这会在运行一段时间后卡住的任何想法?修复它的唯一方法是重新启动服务器,然后在一分钟后再次出现同样的问题。我花了很多时间研究这个问题,但找不到解决方案。

编辑:我发现服务器卡住在 clientSentence = d.readLine();部分。知道为什么吗?

最佳答案

每秒 60 个连接,运行一分钟:每分钟 3600 个连接。

Closing a socket doesn't release immediately the associated file descriptor.您可能会在操作系统层耗尽资源。

尝试在服务器端运行 netstat 以查看 Activity 、挂起和关闭的连接。

您可以 read this post on SU .

关于Java套接字一直卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15452351/

相关文章:

Python套接字编程和ISO-OSI模型

python - 使用 Python 在两台计算机之间流式传输实时视频

java - 异常 : The processing instruction target matching "[xX][mM][lL]" is not allowed

java - 如何将 "unsigned"long 转换为 BigInteger

android - 在对话框中更改标题文本的颜色和字体

android - 在 com.google.firebase.messaging.FirebaseMessagingService 中找不到符号 "messaging"

java - 如何设置特定用户运行processBuilder?

java - 解释循环不变量

java - android-radioButton 返回 id

python - 从服务器 python 向客户端发送连续数据