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