我通过socket代码进行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);
}
}
这会在socket上写入消息并通过tcp进行通信。 (非阻塞呼叫)
我的疑问是,我们如何确定此数据包是否已成功发送或是否被删除,是什么原因通过java代码?
答案 0 :(得分:2)
TCP确认表示数据被推送到TCP / IP堆栈的另一端&它并不一定意味着接收器应用程序已经处理了数据。在windows / linux中,成功的发送完成表明缓冲区被复制到内核模式套接字缓冲区。 您可以尝试将套接字缓冲区设置为零,这使得TCP / IP堆栈只有在收到缓冲区确认后才能完成发送调用。至少在windows&在java中无法假设此行为。
答案 1 :(得分:1)
TCP提供与端点的可靠通信。如果没有错误,则收到消息。 TCP上的维基百科页面指出:
TCP提供可靠,有序和错误检查的流传输 在连接到本地的计算机上运行的程序之间的八位字节数 区域网,内联网或公共互联网。
https://en.wikipedia.org/wiki/Transmission_Control_Protocol
如果通信失败,那么您可以检查已抛出的特定异常。您应该查看API documentation以确定抛出的特定异常及其原因。为了帮助解决这个问题,更有针对性地处理异常处理(分别处理特定类型的异常而不仅仅是捕获Exception
)。