gpt4 book ai didi

Java InputStream 等待数据。

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:11:17 25 4
gpt4 key购买 nike

我正在开发服务器-客户端应用程序,但在等待输入流上的输入数据时遇到问题。

我有线程专用于读取输入数据。目前它使用 while 循环来保持直到数据可用。 (注意协议(protocol)如下:发送数据包的大小,比如 N,作为 int 然后发送 N 个字节)。

public void run(){
//some initialization
InputStream inStream = sock.getInputStream();
byte[] packetData;
//some more stuff
while(!interrupted){
while(inStream.available()==0);
packetData = new byte[inStream.read()];
while(inStream.available()<packetData.length);
inStream.read(packetData,0,packetData.length);
//send packet for procession in other thread
}
}

它可以工作,但是通过 while 循环阻塞线程在我看来是个坏主意。我可以使用 Thread.sleep(X) 来防止资源被循环持续消耗,但肯定有更好的方法。

此外,我不能依赖 InputStream.read 来阻塞线程,因为服务器可能会延迟发送部分数据。我已经尝试过,但总是会导致意外行为。

如果有任何想法,我将不胜感激:)

最佳答案

您可以使用 DataInputStream.readFully()

DataInputStream in = new DataInputStream(sock.getInputStream());
//some more stuff
while(!interrupted) {
// readInt allows lengths of up to 2 GB instead of limited to 127 bytes.
byte[] packetData = new byte[in.readInt()];
in.readFully(packetData);
//send packet for procession in other thread
}

我更喜欢使用支持可重用缓冲区的阻塞 NIO。

SocketChannel sc = 
ByteBuffer bb = ByteBuffer.allocateDirect(1024 *1024); // off heap memory.

while(!Thread.currentThread.isInterrupted()) {
readLength(bb, 4);
int length = bb.getInt(0);
if (length > bb.capacity())
bb = ByteBuffer.allocateDirect(length);
readLength(bb, length);
bb.flip();
// process buffer.
}



static void readLength(ByteBuffer bb, int length) throws EOFException {
bb.clear();
bb.limit(length);
while(bb.remaining() > 0 && sc.read(bb) > 0);
if (bb.remaining() > 0) throw new EOFException();
}

关于Java InputStream 等待数据。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9666783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com