【发布时间】:2016-11-23 08:08:50
【问题描述】:
我有一个服务器应用程序,它在与客户端通信时从客户端读取输入并将其发送到客户端。
目前我正在使用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 部分?
如果没有办法,那就意味着客户端应该总是发送一些东西,以便服务器应用程序继续顺利运行?
任何帮助将不胜感激,谢谢。
【问题讨论】:
-
检查异步读取
-
应该怎么做?
-
要么,你为每个连接创建新线程,它只处理读取的数据 - 然后在不从客户端获取字节的情况下“做一些事情”是没有意义的,它只会阻止处理一个客户端,或者,如果您不想为每个连接创建一个线程,我会使用选择器。这里描述得很好:tutorials.jenkov.com/java-nio/selectors.html
-
@DanyLavrov 这种类型的东西(如异步套接字或异步文件读取)不会阻塞输入。检查我在答案中输入的链接。
-
谢谢你们,我会深入研究的。
标签: java sockets datainputstream