http服务器小demo的问题

问题描述

为什么通过浏览器访问,我的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被版主删除

时间: 2024-08-03 03:58:14

http服务器小demo的问题的相关文章

通信服务器群集——跨服务器通信Demo(源码)

对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人同时在线,而同时在线用户数量通常为5万多,那可想而知,我们需要部署6台TCP应用服务器来分担这些负载.再假设,我们的应用中,任意的两个客户端都有可能需要互发消息(比如,传送文件),这时问题就来了 -- 因为要互发消息的这两个客户端连接的可能是不同的服务器. 如何解决了?这就需要引入群集平台的概念.群

基于BaseAdapter的Listview小Demo

ListView是Android开发中比较常用的控件, 其中适配器模式可以选择: ArrayAdapter:简单易用,通常用于将数组或者List集合的读个包值封装成多个列表项 SimpleAdapter:其实功能很强大将数组或者List集合的读个包值封装成多个列表项 SimpleCursorAdapter:与SimpleAdapter基本类似只是用于包装Cursor提供的数据 BaseAdapter:通常用于被扩展,扩展BaseAdapter可以对各列表项进行最大的定制 而且ListView组件

ofbiz做一个小demo,配置好了之后,在页面上跑。报404错误,请问该怎么解决

问题描述 ofbiz做一个小demo,配置好了之后,在页面上跑.报404错误,请问该怎么解决 ofbiz做一个小demo,配置好了之后,在页面上跑.报404错误 求大神指点

网络编程-android 安卓 4.0 给一个客户端和服务器的demo。

问题描述 android 安卓 4.0 给一个客户端和服务器的demo. android 4.0以后到底是怎么联网的?求大神给一个demo.一个客户端和一个服务器的.服务器端servlet的写的吧.越详细越好.谢谢了.对那个异步消息不是很懂,还有就是子线程一块给详细点.谢谢了 解决方案 楼主,你这个问题有点大...我提供一些思路 客户端就不用说了.服务器端,按照现在的流行趋势,建议用Nodejs + MongoDB.Nodejs就类似tomcat,是给服务器端部署监听,监听客户端的请求.Mong

thrift的小demo谁能帮我写一个java和java传值就好

问题描述 thrift的小demo谁能帮我写一个java和java传值就好 thrift的小demo谁能帮我写一个java和java传值就好最好推荐几个文档谢谢 解决方案 谢谢你们了求助 啊 在不在 啊 解决方案二: qq 420914273我帮你写吧,大家都学生一起 帮忙

html5掷骰子的小demo

原文 html5掷骰子的小demo 代码如下: 1 <!DOCTYPE> 2 <html> 3 <title>柯乐义</title> 4 <head> 5 <script> 6 var leftX = 150; 7 var topY = 100; 8 var diceX = 80; 9 var diceY = 80; 10 var dotR = 4; 11 var count = 0; 12 var lastNum = 0; 13 v

spring-struts2+mybatis+sprin一个小demo总是不能实例化

问题描述 struts2+mybatis+sprin一个小demo总是不能实例化 public class RegisterAction { private RegisterDao registerDao; private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this

red5服务器的demo【publisher】播放视频延迟问题

问题描述 red5服务器的demo[publisher]播放视频延迟问题 本地配置red5服务器成功后,下载自带的demo[publisher]进行视频测试, 视频播放没有问题,但是用VLC播放器播放此rtmp流,存在近10秒的延迟. 在网上找了一个Android连接red5服务器进行视频的demo,调试成功后, 手机摄像头数据能在[publisher]界面显示,但依然存在视频延迟的问题. 麻烦对于red5熟悉的大神们帮忙解决下啊! 个人觉得red5自带的demo都存在延迟问题,是不是得对其服务

求一个用于图片缩小消失小demo

问题描述 求一个用于图片缩小消失小demo 需求是:不管我点击屏幕的哪里除下imageview上图片都要缩小消失 解决方案 那就先弄个控件占满整个屏幕,然后监听点击事件,然后在里面调用函数让这个imageview消失 解决方案二: 网页还是什么?网页 document.onclick=function(){document.getElementById('imageview').style.display='none'}