-1

我需要创建一个单线程观察程序来监视套接字连接以查看它们是否打开或以前打开过,如果它是错误的,则输出一条日志行。

在打开套接字连接的类(3个不同的)中,我创建了一个类似于下面示例的计时器,但这将创建多个我不想要的线程:

if (connectionToCheck()) {
    new Timer().schedule(new TimerTask() {
        @Override
        public void run() {
        if (!socket.isConnected()) {
            LOG.info("connection - {} second timeout: { host={}, port={} }",DEFAULT_TIMEOUT ,host ,port );
        }
    }
}, DEFAULT_TIMEOUT*1000);
socket.connect(new InetSocketAddress(host, port), connect_timeout);

我在java方面不是很有经验,所以如果有人可以给我一些关于如何开始这方面的指示,我正在徘徊。

提前致谢。

编辑:

这个想法是多个连接将同时进行,并且它们都需要被这个新类监视。因此,第一个连接将创建观察者对象,随后的连接只会添加要监视的新连接)。

4

1 回答 1

-1

你不能依赖于输出

socket.isConnected();   

一旦客户端连接(甚至在断开连接之后),socket.isConnected() 总是返回真奇怪!

对于一般概述,您可以轮询每个套接字的状态以了解套接字是否完全打开

有关套接字的状态,请参见http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html

要知道它是否仍然打开,您可以使用心跳

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

https://stackoverflow.com/a/10693807,另见这些评论

以及如何检查当前是否在 Java 中连接了套接字?,如果您决定使用多个线程进行监控,您可以使用

socket.getInputStream().read()

只要客户端连接,线程就会等待输入,因此使您的程序不做任何事情 - 除非您得到一些输入,如果客户端断开连接,则返回 -1

于 2016-01-20T12:13:44.087 回答