Java Advenced Socket编程-服务器到客户端的额外数据传输问题
这里有一台服务器和一台客户机。并通过可选通道保持通信。 像-- 服务器---Java Advenced Socket编程-服务器到客户端的额外数据传输问题,java,sockets,nio,Java,Sockets,Nio,这里有一台服务器和一台客户机。并通过可选通道保持通信。 像-- 服务器--- 问题是,每次客户端读取数据时,都会达到客户端缓冲区的最大大小,而不是发送的数据限制。这是TCP套接字的工作方式——它们是字节流,而不是消息序列 您需要在更高级别的协议中进行设计,以便接收方在收到字节后可以重新发现消息边界。这是TCP套接字的工作方式——它们是字节流,而不是消息序列 您需要在更高级别的协议中进行设计,以便接收方在收到字节后可以重新发现消息边界。您的代码中有一些非常奇怪的东西。难怪它行为不端 从Server
问题是,每次客户端读取数据时,都会达到客户端缓冲区的最大大小,而不是发送的数据限制。这是TCP套接字的工作方式——它们是字节流,而不是消息序列
您需要在更高级别的协议中进行设计,以便接收方在收到字节后可以重新发现消息边界。这是TCP套接字的工作方式——它们是字节流,而不是消息序列
您需要在更高级别的协议中进行设计,以便接收方在收到字节后可以重新发现消息边界。您的代码中有一些非常奇怪的东西。难怪它行为不端
您的代码中有一些非常奇怪的东西。难怪它行为不端
的确UDP可以很好地传递“消息”。我忘了SCTP是否也有同样的功能,或者Java是否支持它。你好,Darron,你能帮我设计协议吗?我可以设置边界吗?甚至在从服务器端发送缓冲区数据之前,我就翻转了设置位置的缓冲区。它不起作用。@subbrajyoti--您的协议必须是您发送的字节数。消息长度或特殊标记字节。无论它是什么,都必须携带足够的信息,以便接收方找到消息边界。UDP可以很好地传递“消息”。我忘了SCTP是否也有同样的功能,或者Java是否支持它。你好,Darron,你能帮我设计协议吗?我可以设置边界吗?甚至在从服务器端发送缓冲区数据之前,我就翻转了设置位置的缓冲区。它不起作用。@subbrajyoti--您的协议必须是您发送的字节数。消息长度或特殊标记字节。无论它是什么,都必须携带足够的信息,以便接收方找到消息边界。
SelectionKey selectKey = channel.register(this.selector,
SelectionKey.OP_ACCEPT);
while (selectKey.selector().select() > 0) {
Set<SelectionKey> selectedKeys = this.selector.selectedKeys();
Iterator<SelectionKey> iterator = selectedKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
iterator.remove();
if (key.isAcceptable()) {
ServerSocketChannel nextChannel = (ServerSocketChannel) key
.channel();
SocketChannel newChannel = nextChannel.accept();
newChannel.configureBlocking(false);
if (!newChannel.isRegistered()) {
SelectionKey selectionKey = newChannel.register(
this.selector, SelectionKey.OP_READ
| SelectionKey.OP_WRITE);
selectionKey.attach(newChannel);
}
} else if (key.isWritable()) {
SocketChannel attachment1 = (SocketChannel)key.attachment();
ByteBuffer writeBuffer = ByteBuffer.wrap("Hello".getBytes());
attachment1.write(writeBuffer);
System.out.print("Written");
}
}
}
InetSocketAddress isa = new InetSocketAddress(InetAddress
.getLocalHost(), 4444);
SocketChannel sc = null;
try {
while (true) {
Thread.sleep(10000);
sc = SocketChannel.open();
sc.connect(isa);
ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE);
int nbytes = sc.read(byteBuffer);
byteBuffer.flip();
dbuf.flip();
CharBuffer cb = decoder.decode(byteBuffer);
System.out.println(isa + " : " + cb);
}