2012-10-20 94 views
1

我對線程領域還不熟悉,而且我正在製作遊戲服務器,將連接到另一個線程的每個客戶端分配,以便我可以在同一端口上接受多個客戶端。但是,我在連接到服務器的客戶機上遇到問題,但無法發送數據(以ObjectOutputStream的格式發送到服務器)。任何可能出錯的指針?多線程服務器不接受客戶端輸出流

這是我爲我的MatchmakingServer.java

try { 
     listenForPlayers = new ServerSocket(portNumber); 
     System.out.println("Port opened. Searching for players"); 
     while (true){ 
      Socket clientSocket = listenForPlayers.accept(); 
      Runnable r = new PlayerHandlerForServer(clientSocket); 
      new Thread(r).start(); 
     } 
    } catch (Exception e) { } 

我PlayerHandler對象實現Runnable,這裏是它的run方法的代碼。

private Player player; 
private ObjectInputStream getPlayerData; 
private static PrintWriter sendPlayerData; 
private Socket socket; 
public void run() { 
    try { 
     getPlayerData = new ObjectInputStream(socket.getInputStream()); 
     player = (Player) getPlayerData.readObject(); 
     //do stuff with the player object, this code get executed. 
     sendPlayerData = new PrintWriter(socket.getOutputStream(),true); 
     updatePlayersFound(sendPlayerData); 
    } catch (Exception e) { } 

} 
+4

'catch(Exception e){}' - 爲什麼忽略異常?你不會開着蒙上眼睛的車,你會嗎? –

+0

oops。我有一位朋友看我的代碼,他說默認的e.printStackTrace()沒有做任何事情,但我猜測它沒有。我發現我的錯誤(玩家不可序列化)。感謝您指出了這一點! – Narabhut

+2

我強烈建議您將來不要使用同一個朋友作爲Java資源。他的建議非常危險。 –

回答

1

正如評論日誌中指出的例外情況,他們會提供一些線索,指出可能導致此問題的原因。

瘋狂的猜測是你的Player類沒有實現Serializable接口。

+0

你是一個聰明的傢伙。 1+ –

+2

我曾與很多人用眼罩開車:-) – gkamal

0

我想知道你爲什麼要從Socket讀取序列化對象,但使用PrintWriter寫出數據。我會建議使用ObjectOutputStream並保持一致。

發送序列化對象可能是矯枉過正。可能會有更多的數據被髮送,然後你關心。這可能會導致遊戲客戶端無用的網絡延遲!你可能想看看使用DataInputStream/DataOutputStream。這將允許您僅使用真正必要的內容來寫/讀對象。

相關問題