2011-02-01 122 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必須相互對齊。