在不打开其IO流的情况下识别丢失的Socket连接

时间:2012-06-13 17:28:41

标签: java multithreading sockets

在创建提供所有四个连接的WorkerThread之前,我的SocketServer首先侦听至少4个 Socket个连接。在同一个线程中,将打开所有4个套接字以与连接的客户端进行通信。

现在,考虑一下服务器已经接受了两个套接字连接但是在继续创建线程之前监听剩余的两个客户端的情况。

在监听阶段,连接的客户端显示“Waiting ...”消息(因为服务器尚未打开套接字以将任何响应发送回客户端,并且socket.readObject()在客户端阻塞),直到服务器获得所有4个客户端。与此同时,其中一个“已经连接”的客户端杀死了“等待......”的事情,并关闭了客户端应用程序。在这种情况下,当我尝试打开它时,我的WorkerThread会因为提供了死套接字而触发异常。

如何在不打开套接字的情况下知道套接字是否指向任何内容(因为客户端丢失)? (因为如果我从主线程打开它,我将无法再从WorkerThread再次打开它,它实际上应该被使用)。

如果我知道Socket是否已经死了,我可以让服务器恢复监听并尝试获得4个连接,然后再继续创建一个线程。

我知道我的SocketServer将被卡在accept()所以即使可以检查我上面提到的内容,我也必须创建另一个线程来监控已经“接受”的套接字连接的活跃性

更新

我的意思是不打开套接字就像下面这样。

Socket s = ss.accept();
/* I'll not be doing as below, since once I close InputStream and OutputStream in main Thread, I can't open in WorkerThread.
But I still want to know if Socket s is connected to client, before I start WorkerThread.


ObjectInputStream in = new ObjectInputStream(s.getInputStream());
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
String msg = in.readObject().toString();
System.out.println("Client Says:");
out.writeObject("success");
in.close();
out.close();

*/
new WorkerThread(s).start();

请注意,我的服务器正在接受4个这样的连接,当4个套接字被accept()编辑时,它会传递WorkerThread的构造函数中的所有4个,并返回accept()另一个4个客户。

1 个答案:

答案 0 :(得分:1)

我认为你需要更好地处理你的接受。每当您尝试读取或写入套接字时,都应该正确处理IOException

一种选择是让接受代码向客户端发送“仍在等待”的消息,并在等待其他连接时经常获得确认。套接字和关联的流已由accept()创建,因此您可以执行此操作,在flush()上调用OutputStream,然后切换到处理程序。

只要您不在流上调用close(),就应该可以毫无问题地重复使用它们。你不能同时使用两个不同的线程。