簡體   English   中英

在Java中解析infinitley長輸入

[英]Parse an infinitley long input in Java

我寫了一個“推送服務器”,當客戶端打開一個連接時,它會在服務器寫入流時保持打開狀態。 我想知道如何編寫一個Java客戶端,它通過這種無限長的響應來接收命令。

問題是我不知道從哪里開始。 如果你能指出我可以閱讀Javadoc的課程方向,那就太棒了。 我希望它能夠立即響應,因此線程可能是必須的。

非常感謝你的幫助!

編輯:無限長度我的意思是未知的長度。 無限一詞用於強化連接通常永遠不會被服務器關閉的點。 並沒有傳輸大量數據。

另一個編輯:也許有助於指出這是一個運行PHP腳本的HTTP服務器。

如果它們是由換行符分隔的簡單命令,那么滾動自己的客戶端應該相當簡單:

編輯: HTTP不是保持長期連接打開的最佳協議,您可能會遇到超時問題。 下面的代碼未經測試,但應該給你一個很好的起點。

編輯2:正如評論中所指出的,線程池在這里可能是必需的,也可能沒有用。 您應該注意,使用線程不會神奇地使事情變得更快或增加您可以處理的請求數量。 使用線程池的好處是允許客戶端在前一個命令仍在執行時立即接收新命令。 如果處理命令需要一些I / O任務,例如調用另一台服務器,那可能很重要,但在您的情況下,它可能有點過分。

ExecutorService svc = Executors.newCachedThreadPool();

URLConnection c = 
    new URL("http://192.168.1.122/push/out.php?nduid=1").openConnection();
c.setReadTimeout(30 * 60 * 1000); // Set the read timeout to 30 minutes
c.connect();
InputStream is = c.getInputStream();
BufferedReader r = new BufferedReader(new InputStreamReader(is, "UTF-8"));

String cmd = null;
while ((cmd = r.readLine()) != null) {
  svc.execute(new Runnable() {
    public void run() {
      processCmd(cmd); // work happens here in a different thread.
    }
  });
}

is.close();

這里的關鍵是只要底層TCP連接保持打開,從套接字返回的輸入流就會保持打開狀態。 客戶端可以繼續從流中讀取, readLine調用將根據需要直接阻塞,直到新數據到達。 readLine返回null時,這意味着底層輸入流遇到文件結尾,這反過來意味着服務器關閉了套接字。

獲得完整的數據后,可以將其提交給線程池,以便在不同的線程中進行解析和執行。 以這種方式打破工作使您可以專注於從單行文本解析和執行命令,這比嘗試處理任意大的數據流更易於管理。

如果打開與服務器的連接,請檢查服務器並使用while(server.isSending) { respond();}然后關閉連接?

例:

//Connection to the server
openConnection();

while(server.isSending()) {

    //Here can you respond in any way
    respond();
}

您可能還必須使用InputStream

我不太熟悉InternetConnections的工作,但我希望你走上正軌

暫無
暫無

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

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