我在localhost上运行服务器聊天和客户端聊天程序。当我尝试连接到服务器时,我的客户端程序冻结在下一行in = new ObjectInputStream(socket.getInputStream());
这是我尝试连接服务器的一段代码
Socket socket = new Socket(host, port);
try {
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
Message m = new Message(null, nick, Message.Type.REGISTER);
out.writeObject(m);
out.flush();
} catch (IOException ex) {
socket.close();
throw ex;
}
消息类实现Serializable接口,因此可以通过网络进行序列化。这是服务器遇到客户端请求的一段代码
try {
ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));
Message m = (Message) in.readObject();
switch (m.getMessageType()) {
case REGISTER:
registerUser(m);
break;
case CHATMESSAGE:
sendMessageToAll(m);
break;
case UNREGISTER:
unregisterUser(m);
break;
}
} catch (ClassNotFoundException ex) {
Logger.getLogger(Chatserver.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Chatserver.class.getName()).log(Level.SEVERE, null, ex);
}
方法registerUser,unregisterUser,sendMessageToAll只需调用next方法
private void sendMessage(Message m, Socket s) throws IOException {
ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(s.getOutputStream()));
out.writeObject(m);
out.flush();
// out.close();
}
哪里出错?
答案 0 :(得分:1)
似乎问题可能与描述here.
的问题相同答案 1 :(得分:0)
刚遇到这个问题..所以在这个帖子中给出答案:
ObjectOutputStream在我们创建它时写入一个流标题(new ObjectOutputStream(out))
类似地,ObjectInputStream,当我们创建它时(新的ObjectInputStream(in)),尝试从服务器端的相应ObjectOutputStream中读取相同的头
这里,在客户端,
in = new ObjectInputStream(socket.getInputStream());
ObjectInputStream在尝试读取流标头时创建了块,因为服务器上没有相应的ObjectOutputStream会将标头写入客户端。
问题不仅仅是这个。如果一侧的ObjectOutputStream创建与客户端的某些其他读取对齐(应该读取我们选择的内容),则它可能会读取流标头而不是实际值,并以不正确的值结束。
解决方案: 在客户端和服务器端创建的ObjectOutputStream和ObjectInputStream必须彼此对齐。