5

我的目标是发送一个带有空数据字段的 TCP 数据包,以便用远程机器测试套接字。

我正在使用 OutputStream 类的 write(byte[] b) 方法。我的尝试:

outClient = ClientSocket.getOutputStream();
outClient.write(("").getBytes());

这样做,数据包永远不会出现在网络上。如果将 "" 替换为 " " 或任何非零字符串,它可以正常工作。

我尝试了 jpcap,它对我有用,但没有达到我的目标。我想扩展 OutputStream 类,并实现我自己的 OutputStream.write 方法。但这超出了我的知识范围。如果有人已经做过这样的事情,请给我建议。

4

2 回答 2

3

如果您只想快速检测静默断开的连接,您可以使用Socket.setKeepAlive( true ). 此方法要求 TCP/IP 处理心跳探测,无需任何数据包或应用程序编程。但是,如果您想对心跳频率进行更多控制,则应使用应用程序级数据包实现心跳。

有关详细信息,请参见此处:http: //mindprod.com/jgloss/socket.html#DISCONNECT

于 2012-05-21T23:12:25.113 回答
-2

There is no such thing as an empty TCP packet, because there is no such thing as a TCP packet. TCP is a byte-stream protocol. If you send zero bytes, nothing happens.

To detect broken connections, short of keepalive which only helps you after two hours, you must rely on read timeouts and write exceptions.

于 2012-05-22T01:17:37.053 回答