仅在数据可用时从套接字读取

时间:2016-11-23 08:08:51

标签: java sockets datainputstream

我有一个服务器应用程序,在与客户端通信时,它从客户端读取输入并发送到客户端。 目前我使用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部分? 如果没有办法,这意味着客户端应该总是发送一些东西,以便服务器应用程序继续顺利运行?

任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

int ln = in.available();

在您描述的情况下,ln将为零,您应该测试并妥善处理。

然而,这是一种处理阻塞I / O的糟糕方法。通常的方法是专门用一个线程来读取套接字并处理它上面的任何内容。

如果您不想这样,您应该使用非阻塞NIO或异步I / O.