[英]SQLRecoverableException: No more data to read from socket only occurs when invoking an oracle package
[英]read from socket only when data available
我有一个服务器应用程序,与客户端通信时会读取客户端的输入并发送给客户端。 目前,我正在使用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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.