2017-07-17 71 views
0

已解決:能夠比我想象的更早進行測試。原來我的服務器端代碼是正確的,而且我並沒有經常檢查客戶端變量的變化。現在完美運作。努力讓客戶端自動接收服務器的更新

我正在使用服務器與客戶端進行通信的端項目。每當java服務器向android客戶端發送更新時,它都會在第一次運行時運行。之後,客戶端不會註冊服務器的消息,因爲在第一次運行時,我已經關閉了套接字,所以我嘗試了不同的方法。

我試圖只通過flush()的數據通過,只有當我完成讀取數據時關閉它,但即使如此,flush()不工作,除非我真的。我的最終目標是通過服務器發送數據,並在發送完成後立即在客戶端顯示該數據。我只是困惑於我如何不斷關閉套接字或流(如果重要,我使用OutputStreamWriter),從服務器向客戶端連續發送數據。

編輯:我忘了提及,但我確實意識到flush()確實將數據發送到客戶端,它只是不更新​​客戶端UI上的數據,直到關閉流爲止。我試圖讓它自動更新

我現在不能發佈我的代碼,因爲我幾個小時都無法訪問它。我試過的一些事情是setTcpNoDelay爲true,並通過字節流發送&,但這不起作用。下面是一些僞代碼,可以讓您瞭解客戶端和服務器的外觀。

服務器:

Open the server socket and make the client socket accept the server socket 

While the user doesnt quit... 
    Enter a value to send to the client and 
    try 
     sendData(). After that, 
close the outputstreamwriter 

sendData(String data) - 
    Declare an outputstreamwriter(Calling it out) 
    out.write(data) 
    out.flush() 

客戶:

BufferedReader takes an InputStreamReader parameter and gets the socket's inputStream 

While the bufferedReader hasNext 
    String message = bufferedReader's input then 
    Display the data 

bufferedReader.close() 

編輯:從做一些研究,並在數據未立即使用,因爲它是被緩衝送?如果這是對的,有沒有辦法加快這個過程?(對不起,如果這聽起來很蠢)

回答

0

我認爲一個更好的選擇是以相反的方式實現協議。也就是說,使客戶端在計時器任務中查詢服務器的更新,而不是從服務器推送更新。

0

這是一個基本問題,所以你到目前爲止不是唯一的這個問題。基本上,服務器無法啓動與客戶端的通信。服務器提供來自客戶端的請求,並且不能啓動通信。在許多情況下,服務器不知道也不關心他將服務多少個客戶端。另一方面,同步通信意味着請求響應週期應該很短,即,即,您不希望長時間或無限期地打開請求連接。因此,如何讓服務器開始與客戶交談有很多不同的方法。

  • 最簡單的就是「輪詢」,即客戶端用預定義的時間段(即每10秒,3小時或任何適合您的需求)向服務器發送請求。這是一個簡單的解決方案,在很多情況下是不夠的,但在某些情況下,它已經足夠了
  • 另一種選擇是同步通信,客戶端發送初始請求,服務器發送確認,即它表示我已收到您的請求並將返回當我有答案的時候給你。客戶端然後將開始偵聽預定義的隊列。然後服務器一旦有答案就會在隊列中發佈答案,客戶端將使用它。

這兩個是最常見的解決方案,但不是唯一的解決方案。

相關問題