服务器和客户端之间交互时使用BufferedReader的阻塞问题

1.遇到的问题

		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("接受完了!");







  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是Java利用Socket通讯原理实现服务器客户之间多线程通信的示例代码: 服务器代码: ```java import java.io.*; import java.net.*; public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(9999); System.out.println("服务器已启动,等待客户连接..."); while (true) { Socket socket = serverSocket.accept(); new ServerThread(socket).start(); } } catch (IOException e) { e.printStackTrace(); } } } class ServerThread extends Thread { private Socket socket; public ServerThread(Socket socket) { this.socket = socket; } public void run() { try { InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); PrintWriter pw = new PrintWriter(os); String line = null; while ((line = br.readLine()) != null) { System.out.println("客户说:" + line); pw.println("服务已接收到消息:" + line); pw.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 客户代码: ```java import java.io.*; import java.net.*; public class Client { public static void main(String[] args) { try { Socket socket = new Socket("localhost", 9999); InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); PrintWriter pw = new PrintWriter(os); BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); String line = null; while ((line = console.readLine()) != null) { pw.println(line); pw.flush(); System.out.println("服务回复:" + br.readLine()); } } catch (IOException e) { e.printStackTrace(); } } } ``` 该示例代码实现了一个简单的服务器客户之间的多线程通信。服务器使用ServerSocket监听口号9999,接收客户的连接请求,并创建一个新线程处理该客户的请求。客户连接服务器后,使用Socket对象的输入输出流与服务器进行通信。在通信过程中,服务器每接收到一条消息就会输出客户发送的内容,并回复一条消息。客户使用控制台输入消息,并等待服务器的回复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值