2013-03-16 77 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. 您正在阅读的行,但发送它们,除非数据已经包含一个换行符,它不应该。