[英]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.