由于长DNS数据包,Android与服务器的通信速度非常慢

时间:2012-02-17 01:26:49

标签: java android timeout dns communication

我正在开发一个通过URLConnection与服务器通信的项目。

以下是代码:

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平板电脑上也试过了相同的代码,它运行正常。查看数据包跟踪,平板电脑没有额外的DNS调用。

我无法控制服务器,并将数据包发送给我。有没有人有什么建议?我猜它是与服务器有关的问题。如果有人有任何想法,我们非常感谢。

谢谢!

2 个答案:

答案 0 :(得分:0)

您使用的是4g还是3g?我今天的体验非常相似,并注意到使用4g时只有延迟。 3g似乎很好。

AFAIK,4g默认使用ipv6地址,而3g默认使用ipv4。这种延迟是ipv6失败,进入故障转移,最后被重新路由。对我来说,花了大约20秒钟。

目前,我正在等待服务器团队的反馈,看看我们的DNS是否已设置为正确处理ipv6。

但老实说,这只是我得到的,抱歉没什么好说的。

答案 1 :(得分: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();

然后像往常一样使用此套接字。

希望这有助于某人。