簡體   English   中英

通過Java套接字發送對象的問題

[英]Question with sending object over java sockets

所以我一直在研究一個使用套接字的2人Tic-Tac-Toe游戲。 所有套接字都正常工作,我在2個客戶端和服務器之間來回成功發送數據。

我有以下類:請求者,提供者和TBoard(擴展Serializable)。

在Requester(客戶端)類中,我實例化了TBoard的對象( TBoard board = new TBoard() )。

然后我通過套接字將該對象通過輸出流發送到我的兩個客戶端。

我得到的錯誤是在客戶端,它是: Exception in thread "main" java.lang.ClassCastException: java.lang.String

這種情況正在發生:

 board = (TBoard) in.readObject(); in:

 do {
    try {
       board = (TBoard) in.readObject();
       System.out.println(board.print_board());
    } catch (ClassNotFoundException classNot) {
       System.err.println("data received in unknown format");
    }

我在TBoard類中的print_board()方法是為了返回一個二維數組,但是為了現在(簡化目的),我有方法返回字符串“Hello”...

有誰知道為什么會這樣? 我不想用代碼轟炸你們所有人,但是如果發布更多信息可能會對我有所幫助...

謝謝!


更新:

以下是我使用Provider(服務器)類進行的(更詳細的):

 // 1. creating a server socket
 providerSocket = new ServerSocket(20092);

 // 2. Wait for connection
 System.out.println("Waiting for connection...");

 connection1 = providerSocket.accept();
 System.out.println("Connection received from Player 1 "    + 

 connection1.getInetAddress().getHostName());
 connection2 = providerSocket.accept();
 System.out.println("Connection received from Player 2 " + connection2.getInetAddress().getHostName());

 // 3. get Input and Output streams
 out = new ObjectOutputStream(connection1.getOutputStream());

 out2 = new ObjectOutputStream(connection2.getOutputStream());

 in = new ObjectInputStream(connection1.getInputStream());
 out.writeObject("Player 1 has been connected successfully.");
 in2 = new ObjectInputStream(connection2.getInputStream());
 out2.writeObject("Player 2 has been connected successfully.");

 out.flush();
 out2.flush();

 out.writeObject(board);
 out2.writeObject(board);

所以我確實在發送最后一個對象(board)之前在流中發送了一個String。 但是,我事先正在沖出溪流。 我也在刷新后嘗試了reset(),它仍然給了我IllegalCastException ...

IIRC,Exception中提到的類是實際找到的類,因此在您顯示的代碼中,錯誤必須在此處:

board = (TBoard) in.readObject();

並且從流中讀取String對象而不是TBoard。

編輯:那么,你除了數據發送字符串。 這是你的問題。 您必須在讀取數據之前停止發送這些字符串,或在接收端讀取它們。 調用flush()與此無關 - 它只是確保您已經寫入流的字符串實際上是通過連接發送的,而不是保存在緩沖區中。

為了研究,我認為最簡單的方法是可視化(記錄或調試)由in.readObject()產生的實際類。 示例代碼:

    Object o = in.readObject();
    System.out.println("Object of class " + o.getClass().getName() + " is " + o);

有幾種可能性。 假設您正在使用ObjectOutputStream(我認為您是這樣),可能會出現錯誤,因為您沒有完全序列化每個對象。 如果每次都不重置流,ObjectOutputStream將嘗試重新發送。

我會嘗試以下方法:

1)確保在適當的時候沖洗()並關閉()套接字

2)嘗試在發送每個對象后調用reset()。

3)檢查您是否正在發送和接收相同的對象類型,以防萬一。

祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM