我正在开发一个通过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调用。
我无法控制服务器,并将数据包发送给我。有没有人有什么建议?我猜它是与服务器有关的问题。如果有人有任何想法,我们非常感谢。
谢谢!
答案 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();
然后像往常一样使用此套接字。
希望这有助于某人。