2012-09-24 120 views
0

我有這個問題,我無法弄清楚什麼是錯的。我在互聯網上搜索過,但沒有成功。我無法通過Java中的套接字發送對象

因此,我必須通過Java中的套接字發送一個對象,而我無法弄清楚如何去做。我嘗試了很多方法。我序列化了對象,我試圖直接寫對象。但似乎沒有任何工作。

細節是我有一個並行的聊天。有時當我打開一個ObjectOutputStream或ObjectInputStream時,我會陷入僵局。我想你們可以幫助我。

它是一個hang子手遊戲,客戶端連接到服務器,服務器應該向客戶端發送一個隨機詞,這是一個對象。

服務器:

 try{ 
      socketConexao = socketRecepcao.accept(); 

    toClient = new DataOutputStream(socketConexao.getOutputStream()); 
    fromClient = new BufferedReader(new InputStreamReader(socketConexao.getInputStream())); 

      //starts the chat 
    Thread chat = new Thread(this); 
    chat.start(); 

    }catch(IOException e){} 

      //i dont really know how to send the object 

    try{ 
     byte[] bytes = serialize(palavraSorteada); 
     toClient.write(bytes); 
    } catch (IOException e){ 
     e.printStackTrace(); 
    } 

客戶:

socketCliente = new Socket(ip, port); 

    toServer = new DataOutputStream(socketCliente.getOutputStream()); 
    fromServer = new BufferedReader(new InputStreamReader(socketCliente.getInputStream())); 

      // starts the chat 
    Thread chat = new Thread(this); 
    chat.start(); 

    }catch(IOException e){System.exit (0);} 

      // and dont really know how to receive the object 

    try{ 
     ObjectInputStream os = new ObjectInputStream(socket.getInputStream()); 
     palavraSorteada = (Palavra) os.readObject(); 
     os.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
+0

你能提供一個更簡單的例子嗎?有很多代碼與你的問題無關。你沒有解釋爲什麼這不起作用,或者你爲什麼編寫二進制文件,但試圖讀取文本,或者你爲什麼要使用DataOutputStream。 –

+0

發送和接收時使用相同的數據協議可能是值得的...即使用ObjectOutputStream和ObjectInputStream,而不僅僅是一個。 –

+0

是的,我意識到這一點。它的工作現在。謝謝。 – bfagundes

回答

1

應該是相當明顯發生了什麼錯在這裏(從你的描述):您可以使用一個通信信道發送不同數據的。由於接收端無法預測接收端將接收到的內容,因此需要添加下一個接收端的信息,因此接收端知道該怎麼做。

,可能沒有人會來麻煩弄清楚你的代碼片段的做法其實,絨毛減少你想問甚至更好的做出一類副本& pasteable運行的例子是什麼(短儘可能)來證明這個問題。

+0

是的,我試圖這樣做,因爲當我把ObjectOutputStream,我得到一個死鎖,客戶端凍結在那裏。 – bfagundes

0

在服務器中,在服務器中拆分類服務器(接受連接)和ServerConnection(單獨的線程)。將變量toClient和fromClient放置到ServerConnection中。現在,當新客戶端連接時,您會破壞這些變量。

在客戶端,無需啓動新線程。