簡體   English   中英

如果服務器未讀取,則跳過Java客戶端套接字寫入

[英]Java client socket writing is skipped if server is not reading

我有一個Java程序,客戶端將使用套接字不斷地向服務器連續發送一個數字。 通常,“ readObject”或“ writeObject”調用將等待,直到另一端准備好發送或接收為止。 但是在我這里的特定情況下,如果服務器當前未在讀取,則客戶端只會跳過對服務器的寫入。

以下是我的客戶代碼。 我有一個Request類來發送信息,對於我來說,這只是一個整數:

    Socket socket = new Socket("localhost", 2910);
    ObjectOutputStream outToServer = new ObjectOutputStream(socket.getOutputStream());
    Random r = new Random();
    while(true) {
        Request request = new Request();
        request.reqType = Request.TYPE.ADD;
        request.add = r.nextInt(100);
        System.out.println("Sending to server: " + request.add);
        outToServer.writeObject(request);
        Thread.sleep(100);
    }

這是服務器部分:

try {
        ObjectInputStream inFromClient = new ObjectInputStream(socket.getInputStream());
        ObjectOutputStream outToClient = new ObjectOutputStream(socket.getOutputStream());

        while(true) {
            Request req = (Request)inFromClient.readObject();

            switch (req.reqType) {
                case ADD : {
                    Logger.getInstance().log(name + " added " + req.add);
                    serv.add(req.add);
                    break;
                }
                case RESULT : {
                    Logger.getInstance().log(name + " produced result " + req.result);
                    break;
                }
                case RETRIEVE : {
                    int[] retrieve = serv.retrieve();
                    Logger.getInstance().log(name + " retrieved: " + retrieve[0] + ", " + retrieve[1] + ", " + retrieve[2]);
                    outToClient.writeObject(new Request(retrieve));
                    break;
                }
            }

        }
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }

上面的代碼在線程中運行。 因此,這里的事情是,我的客戶端發送一個Request對象,並將類型設置為ADD。 服務器將讀取/接收請求,並檢查類型,並發現它是ADD,因此它將調用“ serv.add”。 此調用可能會導致“ wait()”調用,這意味着此處的線程此時已暫停,因此被卡住了。 客戶端將嘗試發送下一個Request對象,但是由於服務器線程卡在了“ serv.add”調用上,因此客戶端似乎沒有寫任何內容,只是跳過了該調用,並進行了while循環再次。 因此,我嘗試發送一堆服務器未收到的請求。

我希望這是有道理的。

所以我想我的問題是:如果服務器當前未嘗試從客戶端讀取,而客戶端正在嘗試寫入,則'writeObject'調用會超時,然后繼續,還是發生了什么?

因此,以供將來參考。 writeObject只會將一堆對象發送到服務器。 readObject將按照自己的進度讀取它們。 似乎有一些與readObject相關的內部緩沖區。 我的客戶端發送30個整數,服務器讀取10個整數,然后是wait()s。 客戶端終止。 服務器將在某個時候繼續運行,然后讀取其余的已發送對象。 所以我什么都不丟。

暫無
暫無

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

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