user-0 提问: 问一个关于http协议的问题

回复:
user: user-1
content: 服务端程序逻辑有误。

user: user-2
content: 先了解HTTP协议, 请求报文如果没有附加数据(GET/HEAD等)收到双换行才停止recv, 如果有(POST/PUT等)还需要收Content-Length字节, 没有这个字段则请求非法

user: user-0
content: 引用 14 楼 zhao4zhong1 的回复:wireshark 服务端用tcpdump  引用 14 楼 zhao4zhong1 的回复:wireshark 服务端用tcpdump抓包发现，服务端的数据也只发了第一次write数据的值，为什么会出现这种情况，write的返回值对，数据确发不出。

user: user-0
content: 引用 7 楼 cfjtaishan 的回复:引用 6 楼 kang2618 的回复:[quote=引用 4楼自信男孩 的回复:][quote=引用 2 楼 kang2618 的回复:] [quote=引用 1楼ckc 的回复:]最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。[/quote]http协议不应该是先读书协议头，然后根据content-length读取响应的字节吗？[/quote] 是的，但是这是两次发过去的数据，它认为没有收到数据包吧，即数据包认为为空。 还是要通过wireshark或者其他工具抓一下看看 [/quote] 抓包发现只能收到第一次write的值，但是服务器端每次的write都是成功的啊。

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:在没问题和有问题两种环境下使用抓包软件wirwshark抓包对比。 用wireshark抓包看了下，第一种情况抓的协议是http协议，第二种不知道为什么抓成了tcp协议，然后协议头后面的数据包都没有读  引用 14 楼 zhao4zhong1 的回复:wireshark 抓包发现只能收到第一次write的值，但是服务器端每次的write都是成功的啊。

user: user-0
content: 引用 7楼自信男孩 的回复:引用 6 楼 kang2618 的回复:[quote=引用 4楼自信男孩 的回复:][quote=引用 2 楼 kang2618 的回复:] [quote=引用 1楼ckc 的回复:]最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。[/quote]http协议不应该是先读书协议头，然后根据content-length读取响应的字节吗？[/quote] 是的，但是这是两次发过去的数据，它认为没有收到数据包吧，即数据包认为为空。 还是要通过wireshark或者其他工具抓一下看看 [/quote]好吧，我回去试一下，这个能抓到浏览器的请求跟接受包。

user: user-1
content: 《Http权威指南》

user: user-3
content: 引用 6 楼 kang2618 的回复:引用 4楼自信男孩 的回复:[quote=引用 2 楼 kang2618 的回复:] [quote=引用 1楼ckc 的回复:]最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。[/quote]http协议不应该是先读书协议头，然后根据content-length读取响应的字节吗？[/quote] 是的，但是这是两次发过去的数据，它认为没有收到数据包吧，即数据包认为为空。 还是要通过wireshark或者其他工具抓一下看看

user: user-0
content: 引用 4楼自信男孩 的回复:引用 2 楼 kang2618 的回复:[quote=引用 1楼ckc 的回复:]最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。[/quote]http协议不应该是先读书协议头，然后根据content-length读取响应的字节吗？

user: user-0
content: 引用 3楼www_adintr_com 的回复:检查下 write 的返回值吧  如果 socket 是异步的, 需要检查到 socket 可写状态后再调用 write 比较好返回值是对的，说明确实是发送成功了。

user: user-3
content: 引用 2 楼 kang2618 的回复:引用 1楼ckc 的回复:最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。

user: user-4
content: 检查下 write 的返回值吧  如果 socket 是异步的, 需要检查到 socket 可写状态后再调用 write 比较好

user: user-0
content: 引用 1楼ckc 的回复:最后加个回车换行试下试了，不行

user: user-5
content: 最后加个回车换行试下

user: user-1
content: wireshark

user: user-1
content: 在没问题和有问题两种环境下使用抓包软件wirwshark抓包对比。

user: user-6
content: http头部加上Connection: Keep-Alive字段试下。

user: user-0
content: 引用 7 楼 cfjtaishan 的回复:引用 6 楼 kang2618 的回复:[quote=引用 4楼自信男孩 的回复:][quote=引用 2 楼 kang2618 的回复:] [quote=引用 1楼ckc 的回复:]最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。[/quote]http协议不应该是先读书协议头，然后根据content-length读取响应的字节吗？[/quote] 是的，但是这是两次发过去的数据，它认为没有收到数据包吧，即数据包认为为空。 还是要通过wireshark或者其他工具抓一下看看 [/quote] 			String str = "HTTP/1.1 404 NOT FOUND\r\n" + 							"Content-Type: text/html\r\n" + 							"Content-Length: 79\r\n" + 							"Server: zhttpd\r\n" + 							"\r\n"; 			String str2 = "<html>" + 					"<head><title>NOT FOUND</title></head>" + 					"<body><p>NOT FOUND</p></body>" + 					"</html>"; 			os.write(str.getBytes()); 			os.write(str2.getBytes()); 换成java的就没问题，很尬尴

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:《Http权威指南》 			String str = "HTTP/1.1 404 NOT FOUND\r\n" + 							"Content-Type: text/html\r\n" + 							"Content-Length: 79\r\n" + 							"Server: zhttpd\r\n" + 							"\r\n"; 			String str2 = "<html>" + 					"<head><title>NOT FOUND</title></head>" + 					"<body><p>NOT FOUND</p></body>" + 					"</html>"; 			os.write(str.getBytes()); 			os.write(str2.getBytes()); 换成java的就没问题，很尬尴