[英]Java server socket reading
我有一個非常特殊的問題,我的最后一招是在StackOverflow上問這個問題,所以請保持開放的態度!
這是兩個程序:
A.客戶端:在Android手機上運行的Java客戶端。 B.服務器:在計算機上運行的Java服務器。
這是這兩個程序的作用:
客戶端每2毫秒(非常快)發送一次服務器坐標(以字符串格式),服務器必須讀取客戶端發送的所有坐標。 為了實現此目的(假設服務器位於10.0.0.1並正在偵聽端口54321),服務器必須具有一個套接字,通過該套接字可以讀取所有傳入的信息。 是的,它確實接收了所有信息,但是有一個陷阱!
現在您有了故事的背景知識,這就是問題所在:
客戶端連接到服務器,並且一旦發生,它將開始以極快的速度發送坐標(以字符串格式)。 服務器確實獲取了所有消息,但是除非客戶端斷開連接,否則它不會停止讀取。 我需要的是服務器在收到它們時分別閱讀每條消息!
這是我用來從套接字讀取的代碼(這是針對服務器的,它在自己的線程上):
while(true) {
try {
BufferedReader socketReader =
new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str = socketReader.readLine();
System.out.println("New Message: " + str);
socketReader.close();
} catch (IOException e) {
//Client disconnected
System.out.println("Client disconnected.");
break;
}
}
這是我從客戶端獲得的輸出(其中x和y是數字):
New Message: x,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,y...and so on
並且該文本僅在客戶端斷開連接后顯示。 我希望它隨着消息的出現而出現。
為了澄清,這是所需的輸出:
New Message: x,y
New Message: x,y
New Message: x,y
New Message: x,y
... and so on
如果有什么用,這里是寫入套接字的方法(此代碼來自客戶端)
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
while(running) {
writer = new PrintWriter(socket.getOutputStream(), true);
writer.write(x+","+y);
writer.flush();
}
因此,總而言之,我需要服務器在客戶端斷開連接時讀取消息,而不是同時讀取所有消息。 PS在C#中,我還編寫了一個服務器,該服務器在讀取信息時會讀取信息,但是在Java中這是行不通的!
您正在調用readLine ,顧名思義,它是用於讀取lines的 。 您的數據不包含行。
如果可能,請更改協議,以使每組坐標以換行符和/或回車符終止。
不幸的是,我認為您將無法使它正常工作。 在商用網絡硬件上2ms的分辨率是不可能的,如果嘗試強行使用,所有的東西都會損壞。 如果啟用Nagle,則ACK延遲時,Nagling會延遲200毫秒。 如果禁用Nagle,則丟棄數據包將使屋頂延遲。
老實說,我會精簡設計並開始仔細考慮您的要求以及如何滿足這些要求。
您在哪里找到了可以每秒發送500個數據包的Android設備? 我所知沒有Wifi可以做到這一點,而GPS在電線上有什么用?
(如果尚未執行將套接字緩沖區縮小到絕對最小值,使用非阻塞寫操作以及通過中止接收器中的部分數據並丟棄部分數據來處理部分寫入的操作,那么您將無所適從。 。如果連接帶寬暫時下降,則不得備份數據。)
每次在客戶端的輸出套接字上執行flush()
。 消息實際上一直在緩沖,直到您現在關閉套接字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.