我有一个从SocketChannel
读取的服务器,如下所示:
private void readDataFromSocket(SocketChannel socketChannel) throws IOException {
BUFFER.clear();
int count = 0;
while ((count = socketChannel.read(BUFFER)) > 0) {
BUFFER.flip();
int limit = BUFFER.limit();
while (limit > 0) {
System.out.print((char) BUFFER.get());
limit--;
}
}
if (count < 0) {
System.out.println("closing the socket!!!");
socketChannel.close();
}
}
下面是客户端向
SocketChannel
写入的客户端:private void write(String str, SocketChannel channel) throws IOException{
byte[] b = str.getBytes();
buffer.clear();
buffer.put(b);
buffer.flip();
while(buffer.hasRemaining()){
channel.write(buffer);
}
}
所以我的问题是:
count
的值将为0(while ((count = socketChannel.read(BUFFER)) > 0)
)吗? count
可能为0。假设客户端写道:
stack overflow
,是否有可能在读取count
后服务器中的stack
将为0,即客户端已发送的消息的一半(认为该消息的大小为1MB)? 最佳答案
使用阻止模式时,您将始终获得至少1个字节。注意:您可能只会得到1个字节,而不会读取“消息”。
当使用非阻塞模式时,实际上大多数时候没有数据包等待您时,您将得到0。
在TCP中,数据以数据包而不是消息的形式发送。这意味着,如果您发送1 MB,则很有可能将其分解为MTU大小的数据包,例如约1500个字节。如果您读取此套接字,则很可能会看到此大小的块,如果自上次读取后传入多个数据包,则可能会看到多个块。除非您读取的数据少于可用数据,否则您将永远看不到数据包的一部分。例如如果正在等待1500个字节,而您仅读取8个字节,则将获得该数据包的一部分。
关于java - 当socketChannel.read(BUFFER)将返回0时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20868269/