java - 使用套接字手动发送 Keep-Alive 数据包

标签 java sockets networking keep-alive

我有一个名为“clientSock”的套接字。它已连接并正常工作。

我在线程中使用循环接收数据,如下:

char[] inputChars = new char[1024];
int charsRead = 0;

    while (!stopNow) {

        try {

            if ((charsRead =  inputStream.read(inputChars)) != -1)
                {

                    System.out.println("Firing");
                    fire_dataRecieved(new String(inputChars, 0, charsRead)); //Fire event.
                }

            } catch (IOException e) {
                //CLIENT HAS DISCONNECTED...
                connectedClient.disconnect();
                stopNow();
            }
        }

我正在考虑通过简单地向另一端发送“#KEEP-ALIVE”来发送“保持 Activity 数据包”。

我可以使用 sendStream.print("#KEEP-ALIVE") 来做到这一点。有更好的方法吗?如果没有,是否有一种有效的方法来检查您是否收到了数据包?或者已经存在的东西可以让你检查另一端是否还活着? clientSock.setKeepAlive(true) 不适合我。我需要按需检查另一端是否存活。

最佳答案

Is there a better way of doing this? If not, is there an efficient way of checking if you got the packet? Or something already there that allows you to check if the other end is alive?

如果连接出现问题,当您发送自己的保持 Activity 数据包时,TCP 堆栈会很快告诉您。它包含一种检查数据包是否以正确的顺序到达的方法。

现在,如果您想要明确确认您的数据包已收到,您应该让另一端发回确认。恕我直言,这有点矫枉过正,但这是您必须要做的。

如果您没有在合理的延迟内(10 秒就足够了)得到响应,并且如果 TCP 堆栈没有抛出某种错误,则意味着另一端的监听方/应用程序没有执行其任务工作。问题出在应用程序级别,而不是 TCP 堆栈级别。

关于java - 使用套接字手动发送 Keep-Alive 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6330085/

相关文章:

java - 如何在同一行显示字符串和数字并在 TI-Basic 中使用 if 语句

python - 尝试将数据从 C++ 发送到 Python 并使用套接字 C++、C++ sendto() 和 python recvfrom() 工作但不是反向

安卓连接

java - 接受用户输入的方法

java - JList 上的 ListSelectionListener 不起作用

java - JDK9 : An illegal reflective access operation has occurred. org.python.core.PySystemState

c - BSD - 使用任何可用的端口?

c++ - c\c++中套接字编程的问题

web-services - 如何避免向 Web 服务发送 2 个重复的 POST 请求

c# - 两个并发的 NetworkStream.BeginWrite 调用会发生什么?