2016-11-23 5 views
0

У меня есть серверное приложение, которое при общении с клиентом считывает данные от клиента и отправляет клиенту. В настоящее время я использую метод DataInputStream.read() для чтения данных от клиента, однако этот метод блокирует процесс. Если данные не поступают, процесс просто ждет и не продолжается. Вот мой код класса, созданный при подключении клиента:чтение из сокета только при наличии данных

public class Client implements Runnable{ 
private SSLSocket threadSocket; 
private boolean running = true; 
private DataOutputStream out; 
private int nPort = 0; 

//This constructor will be passed the socket 
public ClientThread_control(SSLSocket socket, int port){ 
    threadSocket = socket; 
    nPort = port; 
} 

public void run(){ 
    System.out.println("New connection at " + new Date() + "\n"); 
    try { 
     DataInputStream in = new DataInputStream (threadSocket.getInputStream()); 
     out = new DataOutputStream (threadSocket.getOutputStream()); 
     while (running){ 
      // read input data 
      byte[] one = new byte [1]; 
      in.read(one); 
      int ln = in.available(); 
// do some stuff 
      // parse in going message 
      messageParsing(msg); 

// do some stuff .... 

      // go to sleep 
      Thread.sleep(1000); 
     } 
    } 
    catch (IOException ex) {ex.printStackTrace();} 
    catch (InterruptedException ex) {ex.printStackTrace();} 
    finally { 
     try { 
      threadSocket.close(); 
      System.out.println("Connection closed.\n"); 
     } catch (IOException ex) {ex.printStackTrace();} 
    } 
}} 

При отсутствии данных доступны не проскочить мимо in.read(one) линии. Мой вопрос в том, может ли я как-то узнать, есть ли данные или нет, а если нет, то просто пропустите эту часть и продолжите часть do some stuff? Если этого не происходит, это значит, что клиент должен всегда отправлять что-то, чтобы серверное приложение продолжало работать плавно?

Любая помощь будет оценена, спасибо.

+0

check for async прочитайте – saman

+0

Что делать? –

+0

Либо вы создаете для каждого соединения новый поток, который обрабатывает только чтение данных - тогда нет смысла «делать что-то» без получения байтов от клиента, и он блокирует только ручной поиск одного клиента или, если вы не хотите для создания потока для каждого соединения я бы использовал Selectors. Это довольно хорошо описано здесь: http: //tutorials.jenkov.com/java-nio/selectors.html – fairtrax

ответ

1
int ln = in.available(); 

В обстоятельствах вы описываете, ln будет равна нулю, что вы должны проверить и обработать соответствующим образом.

Однако это плохой способ обработки блокировки ввода-вывода. Обычный способ состоит в том, чтобы посвятить поток чтению сокета и обработать все, что приходит на него.

Если вы этого не хотите, вы должны использовать неблокирующий NIO или асинхронный ввод-вывод.