我的问题比以下情况更通用,尽管涵盖了所需的一切。它适用于Java和套接字编程的正确做法。
场景:
我发现的非阻塞I / O的所有示例都是这样的:
InetAddress host = InetAddress.getByName("localhost"); Selector selector = Selector.open(); ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.configureBlocking(false); serverSocketChannel.bind(new InetSocketAddress(host, 1234)); serverSocketChannel.register(selector, SelectionKey. OP_ACCEPT); while (true) { if (selector.select() <= 0) continue; Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> iterator = selectedKeys.iterator(); while (iterator.hasNext()) { key = (SelectionKey) iterator.next(); iterator.remove(); if (key.isAcceptable()) { SocketChannel socketChannel = serverSocketChannel.accept(); socketChannel.configureBlocking(false); socketChannel.register(selector, SelectionKey.OP_READ); // Do something or do nothing } if (key.isReadable()) { SocketChannel socketChannel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); socketChannel.read(buffer); // Something something dark side if (result.length() <= 0) { sc.close(); // Something else } } }
read
是否在缓冲区足够大的情况下从该特定客户端和该特定请求读取所有传入的数据,还是我需要将其放入while
循环内?如果缓冲区不够大?
[write
的情况下,我是否也只做socketChannel.write(buffer)
,并且我很好(至少从程序的角度来看)?
doc here未指定所有传入数据都适合缓冲区的情况。当我有一个阻塞的I / O时,这也使它有些混乱:
但是,如果通道处于阻塞模式并且缓冲区中至少有一个字节剩余,那么此方法将阻塞直到读取至少一个字节。
这是否意味着在这里(阻塞I / O)我需要以任何一种方式通过
read
循环while
(我发现的大多数示例都这样做)?write
操作怎么样?
因此,总而言之,我的问题是,从中间服务器(客户端到第二台服务器)的角度来看,在我的场景中读写数据的正确方法是什么?
我的问题比以下情况更通用,尽管涵盖了所需的一切。它适用于Java和套接字编程的正确做法。场景:一台服务器上有很多客户端。...
如果您没有调用configureBlocking(false)
,则可以,请使用循环来填充缓冲区。