2013-11-28 21 views
1

我有一個用戶定義的類消息,其對象我想在客戶端和服務器之間傳遞。套接字程序發送和接收用戶定義的對象不起作用

Message類如下:

import java.io.Serializable; 

public class Message implements Serializable 
{ 
    String CorS; 
    int data_id; 
    int status_id; 
    Integer value; 
    boolean withdraw; 

    public Message() 
    { 
     CorS = null; 
     data_id = 0; 
     status_id = 0; 
     value = 0; 
     withdraw = false; 
    } 

    public Message(String CorS, int data_id, int status_id, Integer value) 
    { 
     this.CorS = CorS; 
     this.data_id = data_id; 
     this.status_id = status_id; 
     this.value = value; 
    } 

    public Message(boolean withdraw) 
    { 
     this.withdraw = withdraw; 
    } 
} 

在客戶端側的代碼,它發送所述對象到所述服務器如下:

Socket s = null; 
    ObjectInputStream in = null; 
    ObjectOutputStream out = null; 

    String hostname = null; 
    int port_no = 0; 

    HashMap<String, Integer> map = null; 

    Message m = null; 

    map = servers.get("Server" + server); 

    for(String key : map.keySet()) 
    { 
     hostname = key; 
     port_no = map.get(key); 
    } 
    //System.out.println(hostname + " " + port_no); 

    s = new Socket(hostname, port_no); 
    in = new ObjectInputStream(new BufferedInputStream(s.getInputStream())); 
    out = new ObjectOutputStream(new BufferedOutputStream(s.getOutputStream())); 

    s_now = s; 

    m = new Message(client, data, 0, 0); 
    out.writeObject(m); 
    out.flush(); 
    System.out.println("Sent obj"); 

類似地,在服務器端的代碼如下:

while (true) 
    { 
     try 
     { 
      System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); 
      Socket server = serverSocket.accept(); 
      System.out.println("Just connected to " + server.getRemoteSocketAddress()); 

      ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(server.getInputStream())); 
      //ObjectOutputStream out = new ObjectOutputStream(server.getOutputStream()); 

      Message m = (Message) in.readObject(); 

      System.out.println(m.value); 
     } 

     catch (IOException e) 
     { 
      e.printStackTrace(); 
      break; 
     } 
     catch (ClassNotFoundException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

問題是該對象沒有被打印。我得到的輸出如下:

Waiting for client on port 1051... 
Just connected to /127.0.0.1:59216 

在這方面的任何幫助將不勝感激。謝謝:)

回答

4

您需要在ObjectInputStream兩端之前創建ObjectOutputStream

原因是,如Javadoc中所述,相應的構造函數編寫和讀取流頭。因此輸入流構造函數只有在對等體的輸出流構造函數執行後才能返回。所以如果你首先構造兩個輸入流,就會出現死鎖。

+0

謝謝。這工作。但是,你能告訴我爲什麼會出現這種情況嗎?任何合理的解釋? – Maddy

相關問題