[英]Java Socket Connections in Queue
我已經設置了客戶端/服務器。 服務器( Provider.java
)將接受2個Socket連接。 連接后,會詢問每個客戶端他們想玩哪種游戲-Tic Tac Toe,國際象棋或Connect5。根據他們的回答,套接字連接會存儲在特定的游戲隊列中。 因此,井字游戲有一個隊列,而Connect 5有一個隊列,依此類推。
隊列的實現如下:
Queue<Socket> qTTT = new LinkedList<Socket>();
Queue<Socket> qC5 = new LinkedList<Socket>();
Queue<Socket> qChess = new LinkedList<Socket>();
每次添加連接時,都會檢查隊列以查看是否有兩個連接。 如果特定隊列中有兩個連接,則將使用兩個連接啟動該類型的游戲。 (以Factory設計模式設計)。
if (qTTT.size() == 2) {
ObjectOutputStream out = null, out2 = null; // Client 1, Client 2
ObjectInputStream in = null, in2 = null; // Client 1, Client 2
Socket connection1 = null, connection2 = null;
connection1 = qTTT.remove();
connection2 = qTTT.remove();
try {
out = new ObjectOutputStream(connection1.getOutputStream());
out2 = new ObjectOutputStream(connection2.getOutputStream());
in = new ObjectInputStream(connection1.getInputStream());
in2 = new ObjectInputStream(connection2.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
SimpleGameFactory factory = new SimpleGameFactory();
GameStore store = new GameStore(factory);
Game game = store.orderGame("TTT");
System.out.println("We ordered a " + game.getName() + "\n");
tgame.setObject(game);
tgame.setSockets(connection1, connection2);
tgame.setStreams(in, out, in2, out2);
// Start the threaded game
tgame.start();
}
上面是拋出某種流損壞錯誤。 這是我的問題:
首先,當客戶端首次連接時,套接字連接與ObjectInputStream
和ObjectOutputStream
關聯。 這些流不會隨連接傳遞到隊列中,因此在上面的代碼中,新的流被分配給連接。 然后,將這些流傳遞到線程游戲中以啟動游戲。 我可以這樣做嗎(向連接分配新的流)? 將流分配給他們之后?
其次,我是否在隊列中正確存儲/刪除套接字連接?
謝謝你的幫助!
更新:
這是我一直得到的錯誤:
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2232)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2698)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:750)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at Pools.check_pools(Pools.java:34)
at Provider.start(Provider.java:85)
at StartServer.main(StartServer.java:16)
事實證明,我無法將另外一組輸入/輸出流分配給已經分配了一組流的套接字連接。
感謝你的幫助!
老實說,這個問題看起來像是解決大學任務的方法。
提示 :首先編寫簡單的發布者/訂閱者。 設置一個將向套接字寫入問候世界的進程,以及第二個將從該套接字讀取信息的進程。 然后從那里拿走。 我敢打賭,您缺少明顯的東西:-)
您確定在構造對象IO流之前,已從套接字檢索到所有打開的握手嗎?
例如,如果客戶端發送TTT\\n\\n
作為游戲請求,並且您的代碼僅讀取TTT\\n
並將其他\\n
留在流中,則ObjectInputStream將失敗。
您不會顯示從套接字讀取用戶游戲選擇的部分。 因此,這只是一個猜測。
我的猜測是,該異常與您在文章開頭描述的代碼有關。 首先,在程序進入所發布的代碼片段之前,先研究一下您對套接字的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.