簡體   English   中英

隊列中的Java套接字連接

[英]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();
}

上面是拋出某種流損壞錯誤。 這是我的問題:

首先,當客戶端首次連接時,套接字連接與ObjectInputStreamObjectOutputStream關聯。 這些流不會隨連接傳遞到隊列中,因此在上面的代碼中,新的流被分配給連接。 然后,將這些流傳遞到線程游戲中以啟動游戲。 我可以這樣做嗎(向連接分配新的流)? 將流分配給他們之后?

其次,我是否在隊列中正確存儲/刪除套接字連接?

謝謝你的幫助!

更新:


這是我一直得到的錯誤:

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.

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