2013-09-25 118 views
1

我正在使用两个使用套接字进行通信的java进程。java套接字连接阻塞进程

从服务器端,我使用它来发送信息:这里

public void send(Serializable order) 
{ 
    try 
    { 
     if (this.clientSocket != null && this.clientSocket.isBound() && this.clientSocket.isConnected()) 
     { 
      String json = ""; 
      json = mapper.writeValueAsString(order); 
      log.info("sending to client : " + order.getClass()); 

      json = convertToUTF8(json); 

      this.output.write(json + "\n"); 
      this.output.flush(); 
      log.info("Message sent to client"); 
     } 
     else 
     { 
      log.info("no client connected"); 
     } 
    } 
    catch (Exception e) 
    { 
     log.fatal("Exception while trying to send message to client : " + e.getMessage(), e); 
    } 
} 

输出为:

private BufferedWriter output; 

而在客户端,我试着像读取数据:

while (this.running) 
     { 
      try 
      { 
       String msg = in.readLine(); 

       log.debug("MSG VALUE IS : |"+msg+"|\n\n**********\n"); 

       if ("".equalsIgnoreCase(msg) || msg == null) 
       { 
        break; 
       } 

这里是:

private BufferedReader in; 

这里的问题是一段时间后,服务器进程受阻,ANS如果我运行netstat命令,我可以看到的recv-Q和发送-Q值不为0

但我不能再现自己的情况,所以我不知道是什么产生这种情况,是否有办法处理这种情况,还是必须改变阅读数据的方式?

在此先感谢。

回答

0

通常,如果您使用服务器端代码中的阻塞IO操作,则每个客户端都需要拥有它自己的负责发送到该客户端的工作线程。

另一种选择是使用NIO(或使用NIO的某个框架)来允许您的服务器复用事物。

0

为了避免阻塞你应该使用每个请求。

非常简单的例子:

public class App { 


    public static void main(String[] args) throws IOException { 

     ServerSocket serverSocket = null; // consider it is properly initialized 

     while (true /* stub health condition */) { 

      Socket clientSocket = serverSocket.accept(); // the blocking call 
      final Worker worker = new Worker(clientSocket); 

      Thread workerThread = new Thread() { 

       @Override 
       public void run() { 
        // handle request here 
        worker.send(new Serializable(){} /* stub */); 
       } 

      }; 

      workerThread.start(); 
     } 

    } 


} 

class Worker { 

    private Socket clientSocket; 

    Worker (Socket clientSocket) { 
     this.clientSocket = clientSocket; 
    } 

    public void send(Serializable order) { 
     // logic 
    } 

} 
+0

我觉得这不是我只有一个客户端允许的时间,所以我的ServerSocket和插座都在同一个线程线程相关的问题,它可以连续运行在堆栈之前的几天,我不知道如何检查什么是错误的,因为我没有例外,无论是在服务器端还是在客户端,一切都卡住了,直到我杀死了一个进程(并根据netstat的连接仍然建立) – Sylvain