套接字TCP连接写入失败

时间:2014-07-01 13:41:35

标签: java sockets tcp

我通过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代码?

2 个答案:

答案 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)。