2013-09-25 2 views
1

Я работаю с двумя java-процессами, которые общаются через сокеты.java socket connection blocking process

Со стороны сервера, я использую эту возможность для передачи информации:

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

Как правило, если вы используете блокирующие операции ввода-вывода из кода на стороне сервера, каждому клиенту должен быть свой собственный рабочий поток, который отвечает за отправку на этот клиент.

Другой вариант - использовать NIO (или некоторую инфраструктуру, использующую NIO), чтобы ваш сервер мог мультиплексировать вещи.

0

Чтобы избежать блокировки, вы должны использовать thead-per-request.

Очень короткий пример:

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