问题描述
为什么通过浏览器访问,我的server会接受2次连接,有时候是3次连接?但是我看页面上的请求只发了一次啊另外我自己用socket去访问server的话,只会有一次accept,这是为什么?publicclassSimpleHttpServerIO{privateServerSocketChannelserverSocketChannel;privateCharsetcharset=Charset.forName("UTF-8");publicSimpleHttpServerIO()throwsIOException{serverSocketChannel=ServerSocketChannel.open();serverSocketChannel.bind(newInetSocketAddress(80));System.out.println("服务器启动。。。。。");}publicvoidservice(){while(true){SocketChannelchannel=null;try{channel=serverSocketChannel.accept();System.out.println("收到来自客户端的连接:"+channel.getRemoteAddress());StringBuffersb=newStringBuffer("HTTP/1.1200OKrn");sb.append("Content-Type:text/htmlrnrn");channel.write(charset.encode(sb.toString()));ByteBufferbuffer=ByteBuffer.allocate(1024);channel.read(buffer);buffer.flip();Stringstr=charset.decode(buffer).toString();FileInputStreamin;if(str.indexOf("rn")!=-1){str=str.substring(0,str.indexOf("rn"));if(str.indexOf("login.htm")!=-1){in=newFileInputStream("D:\workspace\Socket\src\test5\login.htm");}else{in=newFileInputStream("D:\workspace\Socket\src\test5\index.htm");}FileChannelfileChannel=in.getChannel();fileChannel.transferTo(0,fileChannel.size(),channel);}channel.close();}catch(Exceptione){e.printStackTrace();}finally{if(channel!=null){try{channel.close();}catch(IOExceptione){e.printStackTrace();}}}}}publicstaticvoidmain(Stringargs[])throwsIOException{newSimpleHttpServerIO().service();}}
解决方案
解决方案二:
不仅仅html会请求服务端,包括js、css、img等等都会重新请求服务端。你可以把客户端请求发过来的url打印出来看看。
解决方案三:
引用1楼rumlee的回复:
不仅仅html会请求服务端,包括js、css、img等等都会重新请求服务端。你可以把客户端请求发过来的url打印出来看看。
只发送了一次请求,后台却收到3次。。
解决方案四:
这是在chrome中的结果现在在FireFox中测试一切正常又试了IE10,和chrome中的结果类似,但是刷新的时候会报错:java.io.IOException:远程主机强迫关闭了一个现有的连接。atsun.nio.ch.SocketDispatcher.read0(NativeMethod)atsun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)atsun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)atsun.nio.ch.IOUtil.read(IOUtil.java:197)atsun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:379)attest5.SimpleHttpServerIO.service(SimpleHttpServerIO.java:33)attest5.SimpleHttpServerIO.main(SimpleHttpServerIO.java:66)
解决方案五:
估计是chrome自己向服务器发送了几次请求
解决方案六:
我猜有个icon,链接旁边那个。
解决方案七:
引用4楼dxqrr的回复:
估计是chrome自己向服务器发送了几次请求
为什么呢
解决方案八:
引用5楼u011461314的回复:
我猜有个icon,链接旁边那个。
?不是吧
解决方案九:
可能是拿tab上那个小icon导致的。建议抓一下包试试看。
解决方案十:
引用8楼skgary的回复:
可能是拿tab上那个小icon导致的。建议抓一下包试试看。
用chromeconsole看的和抓包工具抓的一样吗?
解决方案十一:
因为浏览器会去请求icon
解决方案十二:
浏览器会发起favicon.ico的访问,楼主可以下个抓包工具抓一下包看看。
解决方案十三:
引用9楼u012345283的回复:
Quote: 引用8楼skgary的回复:
可能是拿tab上那个小icon导致的。建议抓一下包试试看。用chromeconsole看的和抓包工具抓的一样吗?
理论上应该是一样的,可是,你现在不就是出现了不一样的情况嘛,那就要想办法找原因了。
解决方案十四:
引用11楼gaofuqi的回复:
浏览器会发起favicon.ico的访问,楼主可以下个抓包工具抓一下包看看。
确实是的~为啥chromeconsole里没这个请求呢
解决方案十五:
引用12楼skgary的回复:
Quote: 引用9楼u012345283的回复:
Quote: 引用8楼skgary的回复:
可能是拿tab上那个小icon导致的。建议抓一下包试试看。用chromeconsole看的和抓包工具抓的一样吗?
理论上应该是一样的,可是,你现在不就是出现了不一样的情况嘛,那就要想办法找原因了。
抓了,但是localhost/127.0.0.1的抓不到,网上看了抓到192.168.x.x这种的,但是这种每次只有2次请求1次是真正的,1次是favourite.ico,三次请求的只在localhost这种访问方式下才会出现,还是很疑惑啊~
解决方案:
引用14楼u012345283的回复:
Quote: 引用12楼skgary的回复:
Quote: 引用9楼u012345283的回复:
Quote: 引用8楼skgary的回复:
可能是拿tab上那个小icon导致的。建议抓一下包试试看。用chromeconsole看的和抓包工具抓的一样吗?
理论上应该是一样的,可是,你现在不就是出现了不一样的情况嘛,那就要想办法找原因了。
抓了,但是localhost/127.0.0.1的抓不到,网上看了抓到192.168.x.x这种的,但是这种每次只有2次请求1次是真正的,1次是favourite.ico,三次请求的只在localhost这种访问方式下才会出现,还是很疑惑啊~
我也很好奇是什么内容。那实在不行,你把chrome发上来的包打印出来看看,看它到底请求的是什么内容。
解决方案:
引用15楼skgary的回复:
Quote: 引用14楼u012345283的回复:
Quote: 引用12楼skgary的回复:
Quote: 引用9楼u012345283的回复:
Quote: 引用8楼skgary的回复:
可能是拿tab上那个小icon导致的。建议抓一下包试试看。用chromeconsole看的和抓包工具抓的一样吗?
理论上应该是一样的,可是,你现在不就是出现了不一样的情况嘛,那就要想办法找原因了。
抓了,但是localhost/127.0.0.1的抓不到,网上看了抓到192.168.x.x这种的,但是这种每次只有2次请求1次是真正的,1次是favourite.ico,三次请求的只在localhost这种访问方式下才会出现,还是很疑惑啊~
我也很好奇是什么内容。那实在不行,你把chrome发上来的包打印出来看看,看它到底请求的是什么内容。
我能抓到的包就只有2个,第三个抓不到啊,只能localhost来访问才会有,127貌似也不会有你可以把代码拷了试试噢~
解决方案:
的确很奇怪。。。第二个请求什么都没有发,连上就断开了。。收到来自客户端的连接
解决方案:
引用17楼skgary的回复:
的确很奇怪。。。第二个请求什么都没有发,连上就断开了。。收到来自客户端的连接
这个是IE下的情况吧,chrome和FF貌似不会
解决方案:
引用18楼u012345283的回复:
Quote: 引用17楼skgary的回复:
的确很奇怪。。。第二个请求什么都没有发,连上就断开了。。收到来自客户端的连接这个是IE下的情况吧,chrome和FF貌似不会
说的是chrome...
解决方案:
引用19楼skgary的回复:
Quote: 引用18楼u012345283的回复:
Quote: 引用17楼skgary的回复:
的确很奇怪。。。第二个请求什么都没有发,连上就断开了。。收到来自客户端的连接这个是IE下的情况吧,chrome和FF貌似不会
说的是chrome...
奇怪~~~另外你连上发了几次请求?
解决方案:
引用20楼u012345283的回复:
奇怪~~~另外你连上发了几次请求?
三次,第一次是html,第二次什么都没发,直接断开了;第三次就是GET/favicon.icoHTTP/1.1
解决方案:
引用21楼skgary的回复:
Quote: 引用20楼u012345283的回复:
奇怪~~~另外你连上发了几次请求?三次,第一次是html,第二次什么都没发,直接断开了;第三次就是GET/favicon.icoHTTP/1.1
你试试FF和IE看看
解决方案:
引用22楼u012345283的回复:
Quote: 引用21楼skgary的回复:
Quote: 引用20楼u012345283的回复:
奇怪~~~另外你连上发了几次请求?三次,第一次是html,第二次什么都没发,直接断开了;第三次就是GET/favicon.icoHTTP/1.1
你试试FF和IE看看
都是一个。但是,IE/FF都采用了长连接的方式取数据。最后,你到底想要知道什么。。。
解决方案:
引用23楼skgary的回复:
Quote: 引用22楼u012345283的回复:
Quote: 引用21楼skgary的回复:
Quote: 引用20楼u012345283的回复:
奇怪~~~另外你连上发了几次请求?三次,第一次是html,第二次什么都没发,直接断开了;第三次就是GET/favicon.icoHTTP/1.1
你试试FF和IE看看
都是一个。但是,IE/FF都采用了长连接的方式取数据。最后,你到底想要知道什么。。。
为什么会发三次请求?除了html和icon,还有一次是为了什么另外怎么证明IE/FF用长连接取数据?
解决方案:
第一次空服务器接到空,会做什么,不知道。持久连接是HTTP1.1的新特性。HTTP1.1也够老的。第二次第3次
解决方案:
引用13楼u012345283的回复:
Quote: 引用11楼gaofuqi的回复:
浏览器会发起favicon.ico的访问,楼主可以下个抓包工具抓一下包看看。确实是的~为啥chromeconsole里没这个请求呢
浏览器的机制我也不大懂。
解决方案:
引用24楼u012345283的回复:
Quote: 引用23楼skgary的回复:
Quote: 引用22楼u012345283的回复:
Quote: 引用21楼skgary的回复:
Quote: 引用20楼u012345283的回复:
奇怪~~~另外你连上发了几次请求?三次,第一次是html,第二次什么都没发,直接断开了;第三次就是GET/favicon.icoHTTP/1.1
你试试FF和IE看看
都是一个。但是,IE/FF都采用了长连接的方式取数据。最后,你到底想要知道什么。。。
为什么会发三次请求?除了html和icon,还有一次是为了什么另外怎么证明IE/FF用长连接取数据?
根据请求头里面的keepalive来判断;
解决方案:
自己都是服务器了,在服务端看就可,还抓的这么辛苦干嘛(⊙_⊙)?
解决方案:
引用27楼gaofuqi的回复:
Quote: 引用24楼u012345283的回复:
Quote: 引用23楼skgary的回复:
Quote: 引用22楼u012345283的回复:
Quote: 引用21楼skgary的回复:
Quote: 引用20楼u012345283的回复:
奇怪~~~另外你连上发了几次请求?三次,第一次是html,第二次什么都没发,直接断开了;第三次就是GET/favicon.icoHTTP/1.1
你试试FF和IE看看
都是一个。但是,IE/FF都采用了长连接的方式取数据。最后,你到底想要知道什么。。。
为什么会发三次请求?除了html和icon,还有一次是为了什么另外怎么证明IE/FF用长连接取数据?
根据请求头里面的keepalive来判断;
我看了chrome里的请求也有keep-alive啊
解决方案:
引用28楼u011461314的回复:
自己都是服务器了,在服务端看就可,还抓的这么辛苦干嘛(⊙_⊙)?
多谢提醒。。看到了3次请求,1次是空的,浏览器怎么会发这么一条请求呢?
解决方案:
引用30楼u012345283的回复:
Quote: 引用28楼u011461314的回复:
自己都是服务器了,在服务端看就可,还抓的这么辛苦干嘛(⊙_⊙)?多谢提醒。。看到了3次请求,1次是空的,浏览器怎么会发这么一条请求呢?
1.浏览器会发favicon.ico的访问,这个自己判断一下过滤就可以了;2.3次请求,你看一下,客户端发起就几次?服务端收到了几次?会不会是你服务端的缓冲池太小了?
解决方案:
老实说,你这个服务器写的是有问题的。关键的content-length这个头没有,可能是chrome/ff/ie几个浏览器的容错的机制是不一样造成你现在这样的结果。对于firefox/ie这两个浏览器,你可能还要重做一下测试,个人觉得实际上还是两个连接。第二个连接并没有实际来的及发起,这是因为返回的response并不符合http协议的规定。
解决方案:
该回复于2014-09-22 08:44:52被版主删除