1

在创建提供所有四个连接的 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 个客户端。

4

1 回答 1

1

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

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

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

于 2012-06-14T02:36:49.580 回答