在socket通信中,服务端socket往往会使用socket.getInputStream.read()或socket.getInputStream.read(buffer)去读取客户端的请求内容,而且仅当read方法返回-1时,服务端socket才认定已经没有更多的东西可读了,这个在java doc可以看到
* @return the next byte of data, or -1
if the end of the
* stream is reached.
如果客户端没有特殊处理或者不被我们掌控,read是不会返回-1的,如果数据已经读完,但客户端如果没有shutdownOutput的话 服务端的socket就会一直等待,从而导致阻塞。如果作为一个http server 那客户端的行为是完全不可控的,所以这个时候只能服务端自己来判断,一字一节去解析收到的数据。所以服务端大致流程如下:
1.解析第一行协议,判断是GET还是POST请求
2.把http header信息读完 如果是POST请求,获取content length的值
3.如果是post 接着读完post的内容
4.对其他内容类型的http请求做判断和处理
具体的代码可参考这位仁兄的demo:http://jiangzhengjun.iteye.com/blog/512380