如何分开2直送?

如何分开2直送?

问题描述:

我正在使用Java NIO,并且我想向播放器发送消息,然后立即发送另一条消息。如何分开2直送?

所以我只是发送2条消息一排:

​​

客户端收到消息:

client.read(buffer) 

所以缓冲区看起来是这样的:

message1+message2 

我希望客户端看到它为2条消息, 问题是我写入流中的两次行,客户端一次读取流,并获取所有数据(2条消息),就像它是一条消息。

有没有办法来检查流是空的,只有当它是空的,写第二条消息?

+0

用分界符,例如换行符,然后逐行阅读。 – teppic

+0

是啊,但是当我使用的方法“socketchannel.read”记载了我所有的流?我怎么能限制它? – likesLowLevel

+0

在包含消息中的字节数的每条消息之前发送标题。 – teppic

你的问题其实需要很多答案。作为一个起点,您应该开始阅读关于网络协议和Java套接字编程的文档。协议是为了解决你所面临的问题而发明的。您需要的最简单的协议是Framing协议。

为了让两个(或更多)各方了解对方,你必须定义一个基本共同的“语言”,使他们可以提取和连续的信息或伪连续流解释实际消息。

简言之,经典部件需要实现通信之间的远程方通常是:

  • 发射机,或写入器(典型的是插座写入)
  • 接收机,或读取器(通常为插座来读取 - 经常缓冲)
  • 成帧器(相对于你的成帧协议):它从流帧的消息。
  • 编解码器(一个或多个)(编码器+一个解码器):它们解码成帧消息或编码新的消息作为一个字节是发送或写入流。
  • 然后一堆解释器和处理程序的每种消息
  • 最终业务逻辑发生在处理程序或组件处理消息,命令,处理程序触发或共享的事件。

要严格回答你的问题,如果你使用TCP通信,你应该使用一个成帧协议,它会在你的消息中添加一个固定长度的消息长度头。例如。前两个字节是消息的长度,随后是消息。如果你使用UDP,你不太可能需要成帧器,但需要其他机制。

请根据需要说明您的需求,但首先阅读网络协议上提供的大量文献:从TCP/UDP及其差异开始,标题,有效载荷,内容,分隔符和帧,缓冲区,完整性,握手,优美的关闭流,保持活力,编解码器,...