繁体   English   中英

仅在有数据时才从套接字读取

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM