【问题标题】:read from socket only when data available仅在数据可用时从套接字读取
【发布时间】: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


【解决方案1】:
int ln = in.available();

在您描述的情况下,ln 将为零,您应该对其进行测试并适当处理。

但是,这是一种处理阻塞 I/O 的糟糕方法。正常的方法是专门使用一个线程来读取套接字并处理到达它的任何内容。

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

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 2023-03-04
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多