我有一个服务器应用程序,在与客户端进行通信时,它会从客户端读取输入并发送给客户端。目前,我正在使用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
部分?如果没有办法,那意味着客户端应始终发送某些内容以进行服务器应用程序继续顺利运行?
任何帮助将不胜感激,谢谢。
int ln = in.available();
在您描述的情况下,ln
将为零,您应该对其进行适当的测试和处理。
这是处理阻塞I/O的糟糕方法。正常的方法是将线程用于读取插座并处理到达上的任何内容。
如果您不想要那个,则应使用非阻滞nio或异步I/O。