我需要创建一个单线程监视器来监视套接字连接,以查看它们是打开还是之前是打开的,如果它是假的,则输出一个日志行。
在打开套接字连接的类(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不是很有经验,所以如果有人能给我一些关于如何开始这方面的指示,我就会徘徊。
提前致谢。
编辑:
这个想法是多个连接将同时进行,并且它们都需要被这个新类所监视。因此,第一个连接将创建观察器对象,后续连接将只添加要监视的新连接。
答案 0 :(得分:-1)
你不能依赖
的输出socket.isConnected();
一旦客户端连接(甚至断开连接后),socket.isConnected()总是返回true!
总体概述您可以轮询每个套接字的状态,以了解套接字是否全部打开
对于套接字状态,请参阅http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html
要知道它是否仍处于打开状态,您可以使用心跳
如果您只想快速检测静默删除的连接,可以使用
Socket.setKeepAlive( true )
。此方法要求TCP / IP在没有任何数据包或应用程序编程的情况下处理心跳探测。但是,如果您想要更多地控制心跳的频率,则应该使用应用程序级别的数据包实现心跳。
从https://stackoverflow.com/a/10693807开始,另请参阅these comments。
从How do I check if a Socket is currently connected in Java?开始,如果您决定使用多个线程进行监控,可以使用
socket.getInputStream().read()
只要客户端连接,使线程等待输入,因此使你的程序不做任何事情 - 除非你得到一些输入 如果客户端断开连接,则返回-1