我试图使用Java客户端一次向服务器发送一个字符。
但即使我禁用Nagle的算法,数据包也会被分组。
s.setTcpNoDelay(真);
任何解决方案?
答案 0 :(得分:0)
Tcp连接可确保数据按照您发送的顺序到达。它并不保证它将全部到达一个数据包。它取决于网络和Tcp数据包的大小。因此,您的数据可以分段到达。最好的方法是使用解析数据并让接收方确定数据包是否完整。
答案 1 :(得分:0)
TCP并非旨在让您控制数据包中的数据量,正如Gusman所说,即使您设法制作类似的TCP数据包,也可以允许收件人的内核合并您的数据包一起或分开他们。 TCP旨在为您提供连续的字符流(与UDP相反,它允许您指定哪些数据应该放入一个数据包中。)
但是,我怀疑你想使用UDP。从您的问题来看,您真正想要的是一种分隔通过TCP发送的消息的方法。如果您发送的每条消息都是一行,您可以例如尝试使用换行符结束消息,然后在另一侧读取,直到获得换行符。如果您要发送二进制数据,通常的方法是在实际数据之前发送数据长度,以便收件人知道他必须发送多少数据。
如果你真的需要像这样制作TCP数据包,例如对于攻击,您应该用C语言编写代码并使用操作系统的低级接口,这些接口允许您使用任意标头创建自己的IP数据包并自己实现TCP。