在创建提供所有四个连接的 WorkerThread 之前,我SocketServer
首先会监听至少 4个连接。 Socket
并且在同一个线程中,所有 4 个套接字都将被打开以与连接的客户端进行通信。
现在,考虑这样一种情况,服务器已经接受了两个套接字连接,但正在侦听剩余的 2 个客户端,然后才能继续创建线程。
在侦听阶段,连接的客户端会显示“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()
编辑时,它会传递所有 4 个 inWorkerThread
的构造函数,然后返回给accept()
另外 4 个客户端。