У меня есть серверное приложение, которое при общении с клиентом считывает данные от клиента и отправляет клиенту. В настоящее время я использую метод 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
? Если этого не происходит, это значит, что клиент должен всегда отправлять что-то, чтобы серверное приложение продолжало работать плавно?
Любая помощь будет оценена, спасибо.
check for async прочитайте – saman
Что делать? –
Либо вы создаете для каждого соединения новый поток, который обрабатывает только чтение данных - тогда нет смысла «делать что-то» без получения байтов от клиента, и он блокирует только ручной поиск одного клиента или, если вы не хотите для создания потока для каждого соединения я бы использовал Selectors. Это довольно хорошо описано здесь: http: //tutorials.jenkov.com/java-nio/selectors.html – fairtrax