关于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
- 关于socket 实现聊天室时客户端导致readline出现阻塞解决办法
- android Socket通讯时readline阻塞
- socket readline,阻塞
- java Socket readLine() 阻塞
- J2ME:使用socket实现聊天室客户端
- [JAVA]Socket中BufferedReader.readLine()的阻塞特性导致的数据无法多次发送的问题
- Java mina socket编程时readLine()阻塞问题
- Android socket通信 readline方法阻塞
- 在Android中创建Socket客户端(实现在线聊天室)
- 关于BufferedReader readline 阻塞的问题
- 关于TCP Socket 非阻塞模式时客户端connect返回SOCKET_ERROR的情况
- Socket实现手机聊天室
- web socket实现聊天室
- Socket实现简单聊天室
- Socket实现聊天室
- SOCKET与 线程 完成聊天室 非阻塞
- socket阻塞的解决办法,socket客户端收不到响应报文的处理
- Android中Socket通信readline()方法阻塞问题
- BUG简记
- c++实验6-项目2
- 机器人塔 第七届蓝桥杯javaA组
- 实现用户在网页中给我的QQ邮箱发邮件
- C#Winform程序如何发布并自动升级(图解)
- 关于socket 实现聊天室时客户端导致readline出现阻塞解决办法
- PHP点点滴滴
- Zookeeper系列(六)Zookeeper客户端(JAVA)API之创读取子节点列表
- vector
- MVC单点登录使用小结
- 抽象工厂模式【Abstract Factory Pattern】
- 2017.05.11-2Springboot 页面显示
- SSH Secure File Transfer 新手小贴士
- mysql优化策略