【发布时间】:2024-01-21 21:37:01
【问题描述】:
我通过套接字代码进行 tcp 通信,例如:
public void openConnection() throws Exception
{
socket = new Socket();
InetAddress iNet = InetAddress.getByName("server");
InetSocketAddress sock = new InetSocketAddress(iNet, Integer.parseInt(port));
socket.connect(sock, 0);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
发送方法为:
synchronized void send(String message)
{
try
{
out.println(message);
}
catch (Exception e)
{
throw new RuntimeException(this.getClass() + ": Error Sending Message: "
+ message, e);
}
}
我从网页上读到,TCP/IP 不保证数据包的传递,它会重试,但如果网络太忙,数据包可能会被丢弃([链接])。1
在系统之间传输数据时可能会丢弃数据包,原因有两个:
- 网络利用率高,导致拥塞
- 网络硬件或连接器故障
TCP 被设计为能够在网络上丢弃数据包时做出反应。当数据包成功传送到其目的地时,目标系统将确认消息发送回源系统。如果在某个时间间隔内没有收到此确认,那可能是因为目标系统从未收到数据包,或者因为包含确认的数据包本身丢失了。在任何一种情况下,如果源系统在给定时间内没有收到确认,则源系统假定目标系统从未收到该消息并重新传输它。很容易看出,如果网络性能不佳,首先会丢失数据包,而这些重传消息所增加的负载只会进一步增加网络负载,这意味着将丢失更多数据包。这种行为可能会导致很快在网络上产生危急情况。
有什么方法可以检测到目的地是否成功接收到数据包,我不确定out.println(message); 会抛出任何异常,因为这是非阻塞调用。它会将消息放入缓冲区并返回以让 TCP/IP 完成其工作。
有什么帮助吗?
【问题讨论】:
-
整个重传过程是在不同的层完成的。您无法通过 Java 访问它。它已经为你完成了。
-
但是能保证重传会成功吗?能不失败吗?
-
这就是你的 TCP。它将继续重试(或多或少)。如果在一定时间后不成功,您可能会收到超时错误。
-
是的,关于那个超时,我在哪里可以得到那个超时?在java还是其他地方?
-
它将传播到 Java,是的。查看
Socketjavadoc。
标签: java sockets networking tcp