聊天客户端程序的问题

时间:2011-02-01 18:25:43

标签: java sockets

我在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();
    }

哪里出错?

2 个答案:

答案 0 :(得分:1)

似乎问题可能与描述here.

的问题相同

答案 1 :(得分:0)

刚遇到这个问题..所以在这个帖子中给出答案:

ObjectOutputStream在我们创建它时写入一个流标题(new ObjectOutputStream(out))

类似地,ObjectInputStream,当我们创建它时(新的ObjectInputStream(in)),尝试从服务器端的相应ObjectOutputStream中读取相同的头

这里,在客户端,

in = new ObjectInputStream(socket.getInputStream());

ObjectInputStream在尝试读取流标头时创建了块,因为服务器上没有相应的ObjectOutputStream会将标头写入客户端。

问题不仅仅是这个。如果一侧的ObjectOutputStream创建与客户端的某些其他读取对齐(应该读取我们选择的内容),则它可能会读取流标头而不是实际值,并以不正确的值结束。

解决方案: 在客户端和服务器端创建的ObjectOutputStream和ObjectInputStream必须彼此对齐。