【问题标题】:DataInputStream read not blockingDataInputStream 读取不阻塞
【发布时间】:2017-07-20 01:34:38
【问题描述】:

如果我误解了阻塞的工作原理,请原谅我,据我所知,阻塞会暂停线程直到它准备好,例如在读取用户输入时程序将等待用户点击返回。

我的问题是,它不是等待数据可用,而是读取值为 0 的字节。有没有办法阻止直到数据可用?

readBytes 方法在循环中被调用。

public byte[] readBytes(){
  try{

     //read the head int that will be 4 bytes telling the number of bytes that follow containing data
     byte[] rawLen = new byte[4];
     socketReader.read(rawLen);
     ByteBuffer bb = ByteBuffer.wrap(rawLen);
     int len = bb.getInt();

     byte[] data = new byte[len];
     if (len > 0) {
        socketReader.readFully(data);
     }

     return data;

  } catch (Exception e){
     e.printStackTrace();
     logError("Failed to read data: " + socket.toString());
     return null;
  }
}

【问题讨论】:

  • 扩展 InputStream 的流 阻塞 read 参见 docs.oracle.com/javase/7/docs/api/java/io/… readFully 也阻塞 - 也许服务器正在发送零
  • 您必须在这里原谅我,因为这是我第一次使用套接字。我尝试使用以下内容作为阅读器,结果是相同的。 InputStream socketReaderStream = socket.getInputStream();
  • 您对read() 的使用可能无法读取全部 4 个字节。您是不是要在那里使用readFully() 来确保您读取所有4 个字节? read()的返回值是实际读取的字节数。
  • 你的问题很好。 socketReaderStream 是什么类型的对象?
  • 尝试更改为int br = socketReader.read(rawLen); System.out.println ("Bytes read " + br);(用于调试)

标签: java sockets datainputstream


【解决方案1】:

如果read() 返回-1,则对等方已断开连接。你不处理那个案子。如果检测到流结束,则必须关闭连接并停止读取。目前你没有办法这样做。您需要重新考虑您的方法签名。

您应该使用readInt() 而不是读取长度的那四行代码。目前您假设已经读取了四个字节而没有实际检查。 readInt() 会帮你查。

这样你也永远不会与发件人不同步,目前这是一个严重的风险。

【讨论】:

  • 以前是readInt(),同样的情况,也试过readFully
  • 和什么一样?作为read() 返回-1?不可能。
  • 不是-1,抱歉应该更清楚,同样的读数没有,我现在检查连接是否仍然处于活动状态,服务器不会说它失去连接
  • 正如我在回答中已经说过的,您没有正确处理流的结尾。如果readInt() 遇到流结束,它将排在EOFExceptionreadFully()也是如此。
  • 是的,服务器正在关闭连接,但没有报告它。谢谢大家的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
相关资源
最近更新 更多