关于socket 实现聊天室时客户端导致readline出现阻塞解决办法

来源:互联网 发布:手机找不到网络连接 编辑:程序博客网 时间:2024/06/05 16:25

客户端:

  String val=req.getParameter("text").toString();  String id=req.getParameter("id");  Socket socket =null;   if(id==null||id.equals("")){  socket= new Socket("127.0.0.1",8090);  id=socketFactory.getNewId()+"";  socketFactory.add(Integer.parseInt(id), socket);  }else{  socket=socketFactory.get(Integer.parseInt(id));  }  OutputStream os=socket.getOutputStream();  //向页面传递  PrintWriter write=new PrintWriter(resp.getOutputStream());  write.write(id);  //向服务端传递  PrintWriter swrite=new PrintWriter(os);  swrite.println("i am client"+id+":"+val);      write.close();//  swrite.close();//      os.close();//  os.flush();  swrite.flush();//  write.flush();


 

服务端:

 ServerSocket serversocket=new ServerSocket(8090); for(int i=0;i<10;i++){ Socket socket=serversocket.accept(); System.out.println("获取到请求");  BufferedReader bread=new BufferedReader(new InputStreamReader(socket.getInputStream())); StringBuilder msg=new StringBuilder(); String str=null; while((str=bread.readLine())!=null&&str.length()>0){msg.append(str); }        System.out.print(msg);  PrintWriter write= new PrintWriter(socket.getOutputStream());  write.write("您好 我是服务端");  //服务端回应  write.flush(); }

因为想实现在保持socket连接状态下,实现服务端和客户端的互相通信,结果发现,当服务端接收到socket读取数据时,在readline处发现了阻塞的情况,通过查询资料后发现,readline在接收结束信号后才会停止读取数据,这就意味着需要客户端调用close()或者shutdownOutput()时才能够时当前readline()停止。解决办法

1、每次接收只调用一次readline(不加while循环)

2、使用read()方法,加大buff的内存一次性将数据读取出来

3、为一个socket建立线程,服务端修改后代码如下

 

 ServerSocket serversocket=new ServerSocket(8090);   ExecutorService exec=Executors.newCachedThreadPool();   for(int i=0;i<10;i++){   Socket socket=serversocket.accept();   exec.execute(new Runnable() {  //启用线程      @Override   public void run() {    // TODO Auto-generated method stub     System.out.println("获取到请求");      BufferedReader bread;    try {     bread = new BufferedReader(new InputStreamReader(socket.getInputStream()));            String str=null;      while((str=bread.readLine())!=null){               System.out.println(str);      }    } catch (IOException e) {     // TODO Auto-generated catch block     e.printStackTrace();    }   }  });    PrintWriter write= new PrintWriter(socket.getOutputStream());    write.write("您好 我是服务端");  //服务端回应    write.flush();   }


 

 


 

0 0