2012-02-17 64 views
0

我正在研究通過URLConnection與服務器通信的項目。由於長DNS包造成的與服務器的Android通信非常緩慢

下面是代碼:

URL theSite; 
theSite = new URL(TestURL); 
URLConnection con = theSite.openConnection(); 

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 

然而,這是考慮我的摩托羅拉Atrix和三星Nexus S約20秒或更多的服務器談話時。 (信息最終會發送它的接縫)看着wireshark中的數據包,我發現有很多組的DNS數據包被髮送,每個數據包之間大約有3-5秒。這可能是溝通緩慢的原因。

這是兩個示例DNS數據包。 (我已經改變了IP的,除了8.8.8.8的目標,我認爲這是谷歌)

Time   Source Destination Protocol Info 
20.308792 10.10.120.104 8.8.8.8 DNS  Standard query PTR 3.120.10.10.in-addr.arpa 
25.360726 10.10.120.104 8.8.8.8 DNS  Standard query PTR 3.120.10.10.in-addr.arpa 

不管怎麼說,今天這個事情出藍色。但很顯然,這些DNS調用導致服務器和我的設備之間的通信速度緩慢。

另一件值得注意的事情是,我也嘗試了三星Galaxy 10.1平板電腦上的EXACT相同的代碼,它工作正常。查看數據包追蹤,平板電腦不會有額外的DNS呼叫。

我沒有控制服務器,並且有數據包發送給我。有沒有人有什麼建議?我猜測這是一個服務器相關的問題。如果有人有任何想法,非常感謝。

謝謝!

回答

0

我們已經想通了。在服務器端發現,路由DNS數據包時出現問題,並且他們保持超時,解決了它們已經修復的問題。

爲了確保這個問題不再發生,我們添加了一些東西,那就是手動設置DNS超時,以便在失敗一次後,DNS數據包超時將幾乎是即時的。使用InetSocketAddress是關鍵。

下面是一些示例代碼,以使其工作。

int timeout = 0; //How ever long you want to set the timeout to. 
    somePageParameters = "Parameter String"; 
    InetSocketAddress isock = new InetSocketAddress(ip, 1000); 
    Socket s = null; 
    s = new Socket(); 
    s.connect(isock,timeout); 
    OutputStream os = s.getOutputStream(); 
    String myString = ""; 
    myString = "GET "+"/"+ somePageParameters+" HTTP/1.0\n\r\n\r"; 
    System.err.println("Hitting with: "+myString); 
    byte outbuf[] = myString.getBytes(); 
    os.write(outbuf); 
    os.flush(); 

然後像平常一樣使用這個插座。

希望這可以幫助別人。

0

您使用4g還是3g?今天我的體驗非常相似,並且注意到使用4G時只有延遲。 3G似乎很好。

AFAIK,4G默認使用ipv6地址,而3g默認使用ipv4。該延遲是ipv6失敗,進入故障轉移,並最終被重新路由。對我來說,花了大約20秒。

目前,我正在等待來自服務器團隊的反饋,以查看我們的DNS是否設置爲正確處理ipv6。

但說實話,這只是我得到的,抱歉沒有確定。

+0

一切都已經過測試,迄今只有通過WiFi。感謝評論,我會研究它。如果你能弄清楚,請告訴我。 – Dave 2012-02-17 03:22:05

+0

原來在服務上有一個xml標誌來重定向ipv6。這解決了我們的問題。 – edthethird 2012-02-17 16:23:58