我正在做一个通过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的目的地,我相信是google)
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调用。
我无法控制服务器,并将数据包发送给我。有人有什么建议吗?我猜这是与服务器相关的问题。如果有人有任何想法,我们将不胜感激。
谢谢!
发布于 2012-02-24 03:18:11
我们已经弄清楚了这一点。原来在服务器端,存在路由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();然后像往常一样使用这个套接字。
希望这能帮助到一些人。
发布于 2012-02-17 10:46:33
您使用的是4g还是3g?我今天有一个非常类似的经历,并注意到只有在使用4g时才会出现延迟。3g似乎还不错。
AFAIK,4g默认使用ipv6地址,3g默认使用ipv4。这个延迟是ipv6失败,到达故障转移,最后被重新路由。对我来说,这多花了20秒。
目前,我正在等待服务器团队的反馈,看看我们的域名系统是否正确地处理了ipv6。
但老实说,这只是我得到的,抱歉,这是没有确定的。
https://stackoverflow.com/questions/9321675
复制相似问题