服务器和客户端之间交互时使用BufferedReader的阻塞问题
2012-11-02 16:03
411 查看
1.遇到的问题
上面的代码用于在服务器上面接受客户端的数据。可是while循环永远无法停止,下面的“接受完了”也打印不出来!
2.问题分析:
(1)BufferedReader的readLine方法只有在遇到流结尾或者流关闭了才会返回null
(2)对于读取文件流,当读到文件的结尾时,就是到了流的结尾
(3)但对于socket,不能认为把某次写入到流中的数据读取完了就算流结尾了,但是socket流还存在,还可以继续往里面写入数据然后再读取。所以用BufferedReader封装socket的输入流,调用BufferedReader的readLine方法是不会返回null的
3.还有一种情况,即用InputStream去读,和上面也是一样的错误:
4.这是我在看tomcat源代码的时候,自己写的一个ServerDemo时犯的错误。用于我们想获得的只是客户端发来的HTTP请求,HTTP请求不会太大,所以可以定义一个不是很大的缓冲区把数据存到缓冲区中去。
5.还有一种方式,经过测试,也可以行得通:
Socket socket = serverSocket.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = null; while ((line = br.readLine()) != null) { System.out.println(line); } System.out.println("接受完了!");
上面的代码用于在服务器上面接受客户端的数据。可是while循环永远无法停止,下面的“接受完了”也打印不出来!
2.问题分析:
(1)BufferedReader的readLine方法只有在遇到流结尾或者流关闭了才会返回null
(2)对于读取文件流,当读到文件的结尾时,就是到了流的结尾
(3)但对于socket,不能认为把某次写入到流中的数据读取完了就算流结尾了,但是socket流还存在,还可以继续往里面写入数据然后再读取。所以用BufferedReader封装socket的输入流,调用BufferedReader的readLine方法是不会返回null的
3.还有一种情况,即用InputStream去读,和上面也是一样的错误:
byte[] buf = new byte[1024]; InputStream in = socket.getInputStream(); int i=0; while((i=in.read(buf))!=-1){ String s = new String(buf); System.out.println(s); } System.out.println("接受完了!");
4.这是我在看tomcat源代码的时候,自己写的一个ServerDemo时犯的错误。用于我们想获得的只是客户端发来的HTTP请求,HTTP请求不会太大,所以可以定义一个不是很大的缓冲区把数据存到缓冲区中去。
byte[] buf = new byte[2048]; InputStream in = socket.getInputStream(); int i = in.read(buf); String request = new String(buf,0,i); System.out.println(request); System.out.println("接受完了!");
5.还有一种方式,经过测试,也可以行得通:
Socket socket = serverSocket.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = null; while ((line = br.readLine()) != null && line.length()!=0) { System.out.println(line+"-------------"); } System.out.println("接受完了!");
相关文章推荐
- 关于客户端与服务器ajax使用json数据交互,出现中文乱码或因包含html标答而报错的问题(base64加密)
- 多个客户端使用Socket通过一个服务器进行交互的小例子
- Socket编程总结—Android手机服务器与多个Android手机客户端之间的通信(非阻塞)
- Android之使用HttpPost提交数据到服务器(Android手机客户端和后台服务器交互)
- (8.13)客户端、服务器交互用json,同时去数据库检查,将0、1设置为静态常量(便于加注释它是干什么的,另外多建类,单例模式的使用)
- 在Android上实现SSL握手,实现服务器和客户端之间Socket交互
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决
- 解决workshop开发的服务器端与axis开发的客户端之间的交互通信问题
- windows下使用php socket 和 html5 websocket实现服务器和客户端之间通信
- python:使用socket模块,进行服务器与客户端简单交互
- Android客户端使用HttpURLConnection doGet与服务器数据交互简单示例
- Socket编程总结—Android手机服务器与多个Android手机客户端之间的通信(非阻塞)
- 实践Android客户端与服务端之间使用JSON交互数据。
- java使用多线程编程,实现socket服务器客户端交互
- 解决客户端浏览器和服务器交互的编码问题详解
- Android 使用Json实现服务器与客户端数据的交互
- Linux中使用rsync实现多服务器之间文件同步问题
- 【Android 开发】: Android客户端与服务端之间使用GSON交互数据。
- php+ajax+xml在服务器和客户端之间多次交互数据
- Linux非阻塞IO(五)使用poll实现非阻塞的回射服务器客户端