我调试了程序并观察到当它想要从socket获取输入流时停止:
public Chat(Socket s) throws IOException {
input = new ObjectInputStream(s.getInputStream()); // stopped here
output = new ObjectOutputStream(s.getOutputStream());
initComponents();
}
我在调用上面的构造函数之前关闭了开放流和套接字:
Socket socket = listeningSocket.accept();
disconnect();
Chat c = new Chat(socket);
这是断开方法:
private void disconnect() throws IOException {
input.close();
output.close();
client.close();
}
输入,输出和客户端在这里启动:
client = new Socket(chatServer, chatPort);
input = new ObjectInputStream(client.getInputStream());
output = new ObjectOutputStream(client.getOutputStream());
这是程序暂停时的堆栈跟踪:
Thread [main] (Suspended)
SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available [native method]
SocketInputStream.read(byte[], int, int) line: 146
ObjectInputStream$PeekInputStream.read(byte[], int, int) line: 2282
ObjectInputStream$PeekInputStream.readFully(byte[], int, int) line: 2295
ObjectInputStream$BlockDataInputStream.readShort() line: 2766
ObjectInputStream.readStreamHeader() line: 797
ObjectInputStream.<init>(InputStream) line: 297
Chat.<init>(Socket) line: 20
Client$5.run() line: 310
Client.clientListen() line: 320
Client.access$7(Client) line: 302
Client$6.run() line: 350
Client.main(String[]) line: 352
请帮忙 谢谢:))
答案 0 :(得分:2)
来自ObjectInputStream's constructor的文档:
此构造函数将阻塞,直到相应的ObjectOutputStream为止 写了并刷了头。
是否有任何东西从另一端写入套接字?你是在冲洗另一端的溪流吗?
ObjectOutputStream的构造函数有文档说明用户可能希望刷新到流,以便输入流不会阻塞。
答案 1 :(得分:0)
是否在特定或可能在构造函数内部,甚至在s.getInputStream()调用内停止在该行上?构造函数和getInputStream()都可以抛出IOException。
不要强调这一点,但是在调试它时是否跳转到了构造函数调用和getInputStream()方法?
就像Atreys上面所说,看到堆栈跟踪可能会有用。