1

我正在尝试实现一个简单的服务器(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) {
    }
}
}

服务器线程.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(); 部分。知道为什么吗?

4

2 回答 2

1

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

关闭套接字不会立即释放关联的文件描述符。您可能会在操作系统层耗尽资源。

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

你可以在 SU 上阅读这篇文章

于 2013-03-16T17:40:52.763 回答
0

您的线程永远不会退出,并且您会不断创建新线程。所以你用完了一些东西:线程空间,套接字,FD,......

这都是错误的。您的线程应该循环,或者应该创建一个新线程。不是都。

还:

  1. 您应该使用单个连接,而不是每条消息一个新连接。
  2. 您正在阅读行,但要发送它们,除非数据已经包含换行符,这是不应该的。
于 2013-03-16T21:24:54.823 回答