Java 在不打开IO流的情况下识别丢失的套接字连接

Java 在不打开IO流的情况下识别丢失的套接字连接,java,multithreading,sockets,Java,Multithreading,Sockets,我的SocketServer首先侦听至少4个Socket连接,然后创建一个WorkerThread,在该线程中提供所有四个连接。在同一线程中,所有4个套接字都将打开,以与连接的客户端进行通信 现在,考虑服务器已经接受了两个套接字连接的情况,但是在继续创建线程之前监听剩余的2个客户端。 在侦听阶段,连接的客户端显示“正在等待…”消息(因为服务器尚未打开套接字以向客户端发送任何响应,并且socket.readObject()在客户端阻塞),直到服务器获得所有4个要处理的客户端。同时,一个“已经连接”

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

现在,考虑服务器已经接受了两个套接字连接的情况,但是在继续创建线程之前监听剩余的2个客户端。 在侦听阶段,连接的客户端显示“正在等待…”消息(因为服务器尚未打开套接字以向客户端发送任何响应,并且

socket.readObject()
在客户端阻塞),直到服务器获得所有4个要处理的客户端。同时,一个“已经连接”的客户端杀死了“等待…”的东西,并关闭了客户端应用程序。在这种情况下,当我的WorkerThread试图打开它时,它将由于提供的死套接字而引发异常

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

若我知道套接字是否死了,我可以让服务器恢复监听,并在继续创建线程之前尝试获取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()
ed时,它将通过
WorkerThread
的构造函数中的所有4个,然后返回到
accept()
另外4个客户端。

我认为您只需要更好地处理接受。无论何时尝试读取或写入套接字,都应正确处理
IOException

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


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

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

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


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

我认为您只需要更好地处理您的接受。在您等待其他连接时,可能会每隔一段时间向客户端发送一条“仍在等待”消息以获得确认。@格雷:在不打开套接字的情况下如何发送“仍在等待”(这是此处的限制)?或者可以在线程之间交换套接字的IO流(有点像是通过
WorkerThread
class'构造函数传递的)。我认为您必须“打开”套接字。确实,一旦
accept()
返回,您就已经打开了它——您只是还没有写下任何内容。@格雷:是的,但是打开IO流以读取和写入套接字是我遇到的问题,我无法重新打开IO流-(我的观点是IO流已经在@Kush打开。你不会“重新打开”它们,你只需要再次从套接字获取相关流。我认为你只需要更好地处理你的接受。也许发送一个“仍在等待”在您等待其他连接时,每隔一段时间向客户端发送一条消息以获得确认。@格雷:我如何在不打开套接字的情况下发送“仍在等待”(这是此处的限制)?或者是否可以在线程之间交换套接字的IO流(通过
WorkerThread
class'构造函数传递)。我想你必须“打开”套接字。实际上,一旦
accept()
返回,你就已经打开了它——你只是还没有写下任何内容。@Gray:是的,但是打开IO streams来读写套接字是我遇到的问题,我无法重新打开IO streams.:-(我的观点是IO流已经在@Kush打开了。你不会“重新打开”它们,你只需要再次从套接字获取相关的流。