我正在尝试实现一个简单的服务器(java应用程序)和客户端(android app),其中客户端每秒发送一个字符串大约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();部分。知道为什么吗?
答案 0 :(得分:1)
每秒60个连接,一分钟运行:每分钟3600个连接。
Closing a socket doesn't release immediately the associated file descriptor.您可能在OS层耗尽资源。
尝试在服务器端运行netstat
以查看活动,待处理和已关闭的连接。
答案 1 :(得分:0)
您的主题永不退出,您不断创建新主题。所以你用完了一些东西:线程空间,套接字,FD,......
这都错了。 要么你的线程应该循环或你应该创建一个新的。不是两个。
此外: