gpt4 book ai didi

java - SocketChannel 触发 isReadable() 但没有内容可读

转载 作者:太空宇宙 更新时间:2023-11-03 13:38:11 27 4
gpt4 key购买 nike

我的 Android 应用程序遇到了一个新问题。 SocketChannel 告诉我它是 isReadable() 但没有什么可读的。

while(running)
{
int readyChannels = 0;
try {
readyChannels = selector.select();
} catch (IOException e) {
e.printStackTrace();
}

if(readyChannels == 0) continue;

Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();

while(keyIterator.hasNext())
{
SelectionKey key1 = keyIterator.next();

if(key1.isReadable())
{
publishProgress(1);
}

else if(key1.isWritable())
{
publishProgress(2);
}

else if(!key1.isValid())
{
Log.e("State", "progress error");
publishProgress(3);
}
}
}

我在 onProgressUpdate 中调用所需的函数。这是一个 WebSocket 应用程序,所以我需要发送和接收握手。发送和接收握手与这个 while 循环一起工作。首先发送 SelectionKey.isWriteable() 和握手,然后发送 SelectionKey.isReadable() 并读取握手。但是 SelectionKey.isReadable() 仍然是正确的。现在调用了正常的读取函数(不是 readHandshake)函数。但是没有什么可读的。这是我的阅读功能的代码:

public byte[] read(int nBytes)
{
Log.e("State", "public byte[] read(int nBytes) start");

byte[] resultData = new byte[1024];
ByteBuffer data = ByteBuffer.wrap(resultData);
int remainingBytes = nBytes;

while(remainingBytes >= 0)
{
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = 0;
try {
bytesRead = channel.read(buffer);
} catch (IOException e) {
Log.e("ERROR", "channel read");
}

if(bytesRead < 0)
{
sockState = WebSocketState.WebSocketErrorOccurred;
}

else
{
remainingBytes = remainingBytes - bytesRead;
data.put(buffer.array(), 0, bytesRead);
}
}

Log.e("State", "public byte[] read(int nBytes) done");

return resultData;
}

现在它陷入了无限循环。 remainingBytes 永远不会 < 0,因为没有可读取的内容并且 bytesRead 保持为 0。

我的问题是,当没有任何内容可读时,为什么 isReadable 为真?

最佳答案

如果 bytesRead < 0 你应该关闭 channel 或者至少注销 OP_READ。否则,您将不断收到 OP_READ 来告诉您有关 EOS 的信息。

您不应该为每次读取分配一次 ByteBuffer。分配 ByteBuffers 是一项昂贵的操作。至少为 read 方法的每个条目分配一次。更好的是,在您接受时为每个 channel 分配一个。您可以将它作为或通过 key 附件保留,这样您就不会丢失它,因此当您取消 key 或关闭 channel 时它会消失。

关于java - SocketChannel 触发 isReadable() 但没有内容可读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4139300/

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