我試圖實現一個簡單的服務器(Java應用程序)和客戶端(Android應用程序),其中客戶端每秒發送一個字符串約10次。一切正常工作一分鐘左右,之後服務器停止接收來自客戶端的消息。下面的相關代碼。Java套接字凍結
Thread clientThread = new Thread(new ClientThread(message));
clientThread.start();
ServerThread.jav:
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倍的第二a被初始化並開始使用:
t = new ServerThread(8888);
t.start();
有關爲什麼在運行一段時間後會凍結的想法?解決此問題的唯一方法是重新啓動服務器,然後在一分鐘後再次發生同樣的問題。我花了很多時間研究這個問題,但無法找到解決方案。
編輯:我想出服務器在clientSentence = d.readLine()凍結;部分。任何想法爲什麼?
在開始一個新線程之前,請確保clientthread已完成。 – greenapps 2013-03-16 17:40:25
更好地使用只有一個線程和一個永久連接的插座。 – greenapps 2013-03-16 17:51:46
你總是在一個循環中實例化一個新線程? – 2013-03-16 17:56:54