为什么我读取浏览器客户端发送的请求时会陷入死循环??难道不能这样读取吗??

appleYQL 2016-07-15 08:50:19
源代码如下:只是想测试从服务端获取浏览器的请求并显示出来的简单代码:
public class Server {
ServerSocket server;
public static void main(String[] args) {
Server s=new Server();
s.start();
}

/**
* 启动方法
*/
public void start(){
try {
server=new ServerSocket(8088);
receive();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
/**
* 接收客户端 的信息
*/
private void receive(){
try {
Socket socket=server.accept();

String msg=null;
InputStream is=socket.getInputStream();
int len=0;
byte[] data=new byte[20480];
while(-1!=(len=is.read(data))){
msg=new String(data, 0,len);
if(msg.endsWith("\r\n\r\n")){
//如果不手动判断的话就会陷入死循环,最后程序都不知道执行到哪(用debug调试的时候发现的)
//如果是GET的请求,可以用这个判断,POST方式的话,不能这样
//最后是以这个结束的,说明已经读取完毕跳出这个循环
break;
}
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
来大神请教一下=-=
...全文
121 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
caonimmmma 2016-07-18
  • 打赏
  • 举报
回复
你好,因为socket是长连接,在服务端没有关闭的情况你,客户端只能一直等待,无法判断到底结束了没有,所以你的while已经是一个死循环了。 一般我们解决这样的问题有这么几个方法: 1.约定发送数据的长度,你接收到指定长度直接断开就行了; 2.设置socket超时的时间,setSoTimeout(1000); // 如果超过1000毫秒还没有数据,则抛出 SocketTimeoutException 3.服务端发送完数据直接关闭socket, 这个最常用

81,091

社区成员

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

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