2011-02-01 123 views
0

我有一个运行在本地主机上的服务器聊天和客户端聊天程序。当我尝试连接到服务器我的客户端程序的下一行冻结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; 
      } 

Message类实现Serializable接口的服务器,因此它可以被序列化过网络。这里是一段代码,其中服务器hadle客户端请求

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

上面示例中的'client`是什么? – 2011-02-01 19:56:29

+0

它是指定客户端 – maks 2011-02-01 19:57:53

回答

1

好像这个问题可能是作为一个描述here.

0

就面临过这样的问题相同。所以让在这个线程本身的答案:当我们创建

的ObjectOutputStream写入流头(新的ObjectOutputStream(下))

同样,ObjectInputStream的,当我们创建它(新ObjectInputStream中(上)),尝试在服务器侧

读取从相应的ObjectOutputStream相同的头

在这里,在客户端,

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

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

问题不只是这个。如果一方的ObjectOutputStream创建与客户端的某些其他读取操作相匹配,而这些读取操作应该读取我们选择的某些内容,则可能会读取流标题而不是实际值,并以不正确的值结束。

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