http服务器小demo的问题

百里马 2014-08-17 01:56:19
为什么通过浏览器访问,我的server会接受2次连接,有时候是3次连接?
但是我看页面上的请求只发了一次啊

另外我自己用socket去访问server的话,只会有一次accept,这是为什么?


public class SimpleHttpServerIO {
private ServerSocketChannel serverSocketChannel;
private Charset charset = Charset.forName("UTF-8");

public SimpleHttpServerIO() throws IOException {
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(80));
System.out.println("服务器启动。。。。。");
}

public void service() {
while (true) {
SocketChannel channel = null;
try {
channel = serverSocketChannel.accept();
System.out.println("收到来自客户端的连接:" + channel.getRemoteAddress());
StringBuffer sb = new StringBuffer("HTTP/1.1 200 OK\r\n");
sb.append("Content-Type:text/html\r\n\r\n");
channel.write(charset.encode(sb.toString()));

ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);
buffer.flip();
String str = charset.decode(buffer).toString();
FileInputStream in;
if (str.indexOf("\r\n") != -1) {
str = str.substring(0, str.indexOf("\r\n"));
if (str.indexOf("login.htm") != -1) {
in = new FileInputStream(
"D:\\workspace\\Socket\\src\\test5\\login.htm");
} else {
in = new FileInputStream(
"D:\\workspace\\Socket\\src\\test5\\index.htm");
}
FileChannel fileChannel = in.getChannel();
fileChannel.transferTo(0, fileChannel.size(), channel);
}
channel.close();
} catch (Exception e) {
e.printStackTrace();
} finally{
if(channel != null){
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
}

public static void main(String args[]) throws IOException {
new SimpleHttpServerIO().service();
}
}
...全文
403 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
skgary 2014-08-20
  • 打赏
  • 举报
回复
老实说,你这个服务器写的是有问题的。 关键的content-length这个头没有,可能是chrome/ff/ie几个浏览器的容错的机制是不一样造成你现在这样的结果。 对于firefox/ie这两个浏览器,你可能还要重做一下测试,个人觉得实际上还是两个连接。第二个连接并没有实际来的及发起,这是因为返回的response并不符合http协议的规定。
gaofuqi 2014-08-20
  • 打赏
  • 举报
回复
引用 30 楼 u012345283 的回复:
[quote=引用 28 楼 u011461314 的回复:] 自己都是服务器了,在服务端看就可,还抓的这么辛苦干嘛(⊙_⊙)?
多谢提醒。。 看到了3次请求,1次是空的,浏览器怎么会发这么一条请求呢? [/quote] 1.浏览器会发favicon.ico的访问,这个自己判断一下过滤就可以了; 2.3次请求,你看一下,客户端发起就几次?服务端收到了几次?会不会是你服务端的缓冲池太小了?
百里马 2014-08-20
  • 打赏
  • 举报
回复
引用 28 楼 u011461314 的回复:
自己都是服务器了,在服务端看就可,还抓的这么辛苦干嘛(⊙_⊙)?
多谢提醒。。 看到了3次请求,1次是空的,浏览器怎么会发这么一条请求呢?
百里马 2014-08-20
  • 打赏
  • 举报
回复
引用 27 楼 gaofuqi 的回复:
[quote=引用 24 楼 u012345283 的回复:] [quote=引用 23 楼 skgary 的回复:] [quote=引用 22 楼 u012345283 的回复:] [quote=引用 21 楼 skgary 的回复:] [quote=引用 20 楼 u012345283 的回复:] 奇怪~~~另外你连上发了几次请求?
三次,第一次是html,第二次什么都没发,直接断开了;第三次就是 GET /favicon.ico HTTP/1.1[/quote] 你试试FF和IE看看 [/quote] 都是一个。 但是,IE/FF都采用了长连接的方式取数据。 最后,你到底 想要知道什么。。。[/quote] 为什么会发三次请求? 除了html和icon,还有一次是为了什么 另外怎么证明IE/FF用长连接取数据?[/quote] 根据请求头里面的keepalive来判断;[/quote] 我看了chrome里的请求也有keep-alive啊
zhjdg 2014-08-20
  • 打赏
  • 举报
回复
自己都是服务器了,在服务端看就可,还抓的这么辛苦干嘛(⊙_⊙)?
gaofuqi 2014-08-20
  • 打赏
  • 举报
回复
引用 24 楼 u012345283 的回复:
[quote=引用 23 楼 skgary 的回复:] [quote=引用 22 楼 u012345283 的回复:] [quote=引用 21 楼 skgary 的回复:] [quote=引用 20 楼 u012345283 的回复:] 奇怪~~~另外你连上发了几次请求?
三次,第一次是html,第二次什么都没发,直接断开了;第三次就是 GET /favicon.ico HTTP/1.1[/quote] 你试试FF和IE看看 [/quote] 都是一个。 但是,IE/FF都采用了长连接的方式取数据。 最后,你到底 想要知道什么。。。[/quote] 为什么会发三次请求? 除了html和icon,还有一次是为了什么 另外怎么证明IE/FF用长连接取数据?[/quote] 根据请求头里面的keepalive来判断;
gaofuqi 2014-08-20
  • 打赏
  • 举报
回复
引用 13 楼 u012345283 的回复:
[quote=引用 11 楼 gaofuqi 的回复:] 浏览器会发起favicon.ico的访问,楼主可以下个抓包工具抓一下包看看。
确实是的~为啥chrome console里没这个请求呢[/quote] 浏览器的机制我也不大懂。
zhjdg 2014-08-20
  • 打赏
  • 举报
回复
第一次 空 服务器接到 空,会做什么,不知道。 持久连接 是 HTTP1.1 的新特性。 HTTP1.1 也够老的。 第二次 第3次
百里马 2014-08-20
  • 打赏
  • 举报
回复
引用 23 楼 skgary 的回复:
[quote=引用 22 楼 u012345283 的回复:] [quote=引用 21 楼 skgary 的回复:] [quote=引用 20 楼 u012345283 的回复:] 奇怪~~~另外你连上发了几次请求?
三次,第一次是html,第二次什么都没发,直接断开了;第三次就是 GET /favicon.ico HTTP/1.1[/quote] 你试试FF和IE看看 [/quote] 都是一个。 但是,IE/FF都采用了长连接的方式取数据。 最后,你到底 想要知道什么。。。[/quote] 为什么会发三次请求? 除了html和icon,还有一次是为了什么 另外怎么证明IE/FF用长连接取数据?
skgary 2014-08-20
  • 打赏
  • 举报
回复
引用 22 楼 u012345283 的回复:
[quote=引用 21 楼 skgary 的回复:] [quote=引用 20 楼 u012345283 的回复:] 奇怪~~~另外你连上发了几次请求?
三次,第一次是html,第二次什么都没发,直接断开了;第三次就是 GET /favicon.ico HTTP/1.1[/quote] 你试试FF和IE看看 [/quote] 都是一个。 但是,IE/FF都采用了长连接的方式取数据。 最后,你到底 想要知道什么。。。
百里马 2014-08-20
  • 打赏
  • 举报
回复
引用 21 楼 skgary 的回复:
[quote=引用 20 楼 u012345283 的回复:] 奇怪~~~另外你连上发了几次请求?
三次,第一次是html,第二次什么都没发,直接断开了;第三次就是 GET /favicon.ico HTTP/1.1[/quote] 你试试FF和IE看看
skgary 2014-08-20
  • 打赏
  • 举报
回复
引用 20 楼 u012345283 的回复:
奇怪~~~另外你连上发了几次请求?
三次,第一次是html,第二次什么都没发,直接断开了;第三次就是 GET /favicon.ico HTTP/1.1
百里马 2014-08-20
  • 打赏
  • 举报
回复
引用 19 楼 skgary 的回复:
[quote=引用 18 楼 u012345283 的回复:] [quote=引用 17 楼 skgary 的回复:] 的确很奇怪。。。 第二个请求什么都没有发,连上就断开了。。 收到来自客户端的连接
这个是IE下的情况吧,chrome和FF貌似不会[/quote] 说的是chrome...[/quote] 奇怪~~~另外你连上发了几次请求?
skgary 2014-08-20
  • 打赏
  • 举报
回复
引用 18 楼 u012345283 的回复:
[quote=引用 17 楼 skgary 的回复:] 的确很奇怪。。。 第二个请求什么都没有发,连上就断开了。。 收到来自客户端的连接
这个是IE下的情况吧,chrome和FF貌似不会[/quote] 说的是chrome...
百里马 2014-08-20
  • 打赏
  • 举报
回复
引用 17 楼 skgary 的回复:
的确很奇怪。。。 第二个请求什么都没有发,连上就断开了。。 收到来自客户端的连接
这个是IE下的情况吧,chrome和FF貌似不会
skgary 2014-08-20
  • 打赏
  • 举报
回复
的确很奇怪。。。 第二个请求什么都没有发,连上就断开了。。 收到来自客户端的连接
百里马 2014-08-20
  • 打赏
  • 举报
回复
引用 15 楼 skgary 的回复:
[quote=引用 14 楼 u012345283 的回复:] [quote=引用 12 楼 skgary 的回复:] [quote=引用 9 楼 u012345283 的回复:] [quote=引用 8 楼 skgary 的回复:] 可能是拿tab上那个小icon导致的。 建议抓一下包试试看。
用chrome console看的和抓包工具抓的一样吗?[/quote] 理论上应该是一样的,可是,你现在不就是出现了不一样的情况 嘛,那就要想办法找原因了。[/quote] 抓了,但是localhost/127.0.0.1的抓不到,网上看了抓到192.168.x.x这种的,但是这种每次只有2次请求 1次是真正的,1次是favourite.ico,三次请求的只在localhost这种访问方式下才会出现,还是很疑惑啊~[/quote] 我也很好奇是什么内容。 那实在不行,你把chrome 发上来的包打印出来看看,看它到底 请求的是什么 内容。[/quote] 我能抓到的包就只有2个,第三个抓不到啊,只能localhost来访问才会有,127貌似也不会有 你可以把代码拷了试试噢~
skgary 2014-08-20
  • 打赏
  • 举报
回复
引用 14 楼 u012345283 的回复:
[quote=引用 12 楼 skgary 的回复:] [quote=引用 9 楼 u012345283 的回复:] [quote=引用 8 楼 skgary 的回复:] 可能是拿tab上那个小icon导致的。 建议抓一下包试试看。
用chrome console看的和抓包工具抓的一样吗?[/quote] 理论上应该是一样的,可是,你现在不就是出现了不一样的情况 嘛,那就要想办法找原因了。[/quote] 抓了,但是localhost/127.0.0.1的抓不到,网上看了抓到192.168.x.x这种的,但是这种每次只有2次请求 1次是真正的,1次是favourite.ico,三次请求的只在localhost这种访问方式下才会出现,还是很疑惑啊~[/quote] 我也很好奇是什么内容。 那实在不行,你把chrome 发上来的包打印出来看看,看它到底 请求的是什么 内容。
百里马 2014-08-20
  • 打赏
  • 举报
回复
引用 12 楼 skgary 的回复:
[quote=引用 9 楼 u012345283 的回复:] [quote=引用 8 楼 skgary 的回复:] 可能是拿tab上那个小icon导致的。 建议抓一下包试试看。
用chrome console看的和抓包工具抓的一样吗?[/quote] 理论上应该是一样的,可是,你现在不就是出现了不一样的情况 嘛,那就要想办法找原因了。[/quote] 抓了,但是localhost/127.0.0.1的抓不到,网上看了抓到192.168.x.x这种的,但是这种每次只有2次请求 1次是真正的,1次是favourite.ico,三次请求的只在localhost这种访问方式下才会出现,还是很疑惑啊~
百里马 2014-08-20
  • 打赏
  • 举报
回复
引用 11 楼 gaofuqi 的回复:
浏览器会发起favicon.ico的访问,楼主可以下个抓包工具抓一下包看看。
确实是的~为啥chrome console里没这个请求呢
加载更多回复(12)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧