2011-11-16 21 views
2

問候和敬意,一個引人入勝的鉚接的java多線程插座居心不良

我有兩個Android應用:一個是服務器,一個是客戶端。服務器接收來自兩個或更多客戶端的字符串。服務器測試輸入的衝突(例如,在1ms內收到的輸入或其他)。一旦客戶端與服務器建立連接,服務器就實例化一個運行while-true線程的客戶端對象,以方便輸入接收。

我相信隨着CPU的OS分時,線程交替執行。這是一個問題,因爲我需要知道兩個InputStream是在一個ms還是兩個ms之間發送消息。我怎麼可以允許這個?


public void run() { 
    while (true) { 
    try { 
     if (input.ready()) { 
     String s = input.readLine(); 
      //do stuff, like comparing socket inputs 
     } 
    } catch (Exception e) { 
    } 
} 

回答

3

我認爲你會發現更大的問題是,單是網絡層將在許多毫秒級的時間引入的變異(只是看的時間範圍內運行ping程序時),這樣,即使客戶都在同一時刻發送,你會發現他們經常都會以大於幾毫秒的三角洲時間到達。根據無線電硬件以及位於VM和物理網絡之間的內核配置,發送方和接收方都可能遇到與處理傳入網絡數據相關的其他時間問題。我的意思是,檢測幾毫秒的時間衝突可能是不可能的。

我建議你發送一個時間戳與來自客戶端的消息,以便它處理時無關緊要。爲了使它更加準確,您可以在協議啓動時添加一些簡單的時間同步來查找客戶端和服務器設備時鐘之間的差異。

如果目標是首先知道哪個客戶端發送了數據,那麼您可以假設被阻止的input.readline()首先返回的是首先發送數據的數據,給定的數據具有類似的長度和類似的ping延遲每個客戶。這將在正常情況下是正確的。爲了處理可變長度數據和一些與物理網絡相關的其他問題,一個好的方法是做一個字節讀取而不是整行,這樣可以更好地近似誰先到達,而不是哪個客戶端能夠到達發送更快的整個線路。