我有一个基于服务器多客户端交互的应用程序。这是我在服务器类中使用的线程,用于创建一个新线程,我接受所有新套接字:
Thread acceptingThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Socket s = serverSocket.accept();
listaSocket.add(s);
listaOis.add(new ObjectInputStream(s.getInputStream()));
listaOos.add(new ObjectOutputStream(s.getOutputStream()));
System.out.println("Client connected");
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
acceptingThread.start();
private ServerSocket serverSocket;
private ArrayList<Socket> listaSocket;
private ArrayList<ObjectInputStream> listaOis;
private ArrayList<ObjectOutputStream> listaOos;
阻止程序的行是:
listaOis.add(new ObjectInputStream(s.getInputStream()));
listaOos.add(new ObjectOutputStream(s.getOutputStream()));
答案 0 :(得分:1)
您的代码在此特定行中被阻止:
ObjectInputStream
记下此InputStream
构造函数的行为。来自Javadoc:
创建一个从指定的InputStream读取的ObjectInputStream。从流中读取序列化流头并进行验证。 此构造函数将阻塞,直到相应的ObjectOutputStream已写入并刷新标头。
从传入连接获取socket.accept()
意味着需要通过连接发送序列化数据。这意味着您必须在构造函数继续之前执行以下操作:
OutputStream
OutputStream
。ObjectOutputStream
包裹ObjectOutputStream
。