2013-03-16 72 views
1

我試圖實現一個簡單的服務器(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()凍結;部分。任何想法爲什麼?

+0

在開始一個新線程之前,請確保clientthread已完成。 – greenapps 2013-03-16 17:40:25

+1

更好地使用只有一個線程和一個永久連接的插座。 – greenapps 2013-03-16 17:51:46

+0

你總是在一個循環中實例化一個新線程? – 2013-03-16 17:56:54

回答

0

您的線程永遠不會退出,您不斷創建新線程。所以你用完東西:線程空間,套接字,FD,...

這是錯的。 要麼你的線程應循環你應該創建一個新的。不是都。

另外:

  1. 你應該使用一個連接,而不是每個消息一個新的。
  2. 您正在閱讀的行,但發送它們,除非數據已經包含一個換行符,它不應該。