Sokcet问题

进天遇到一个Sokcet问题,以下是有问题的代码

客户端:

public class SocketClient {

public static void main(String[] args) throws IOException {
  Socket s = new Socket("127.0.0.1",11224);
  OutputStream out = s.getOutputStream();
  PrintWriter writer = new PrintWriter(new OutputStreamWriter(out));
  writer.println(""+"发出请求消息\r\n");
  writer.flush();

  InputStream in = s.getInputStream();
  BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  String line;
  while((line=reader.readLine())!=null){
   System.out.println("SocketClient"+line);
  }
  writer.close();
  reader.close();
  s.close();
  System.out.println("over");
}

}
服务端:

public class SocketServer {

public static void main(String[] args) throws IOException {
  ServerSocket ss = new ServerSocket(11224);
  Socket s = null;
  while(true){
   s = ss.accept();
   InputStream in = s.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
   String line;
   while((line = reader.readLine())!=null){
    System.out.println("SocketServer:"+line);
   }

//   line = reader.readLine();
//   System.out.println("SocketServer:"+line);
//   System.out.println(reader.readLine());
   OutputStream out = s.getOutputStream();
   PrintWriter writer = new PrintWriter(new OutputStreamWriter(out));
   writer.println("收到信息\r\n");
   writer.flush();

   writer.close();
   reader.close();
  }
}

}

分别运行服务端和客户端,程序会在服务端循环调用reader.readLine();处阻塞,从而客户端得不到响应。 但是当去掉循只运行一次reader.readLine()方法让服务端正常响应,在客户端的循环readLine()方法却并未阻塞  而是在读完响应后正常返回了null。

经过总结服务端跳出读取数据的循环有两种方法:1.在客户端发送的请求数据中写上报文长度,服务端根据长度解析报文。2.客户端发送的请求报文结束后与服务端约定一个结束标志,服务端独到结束标志,结束读取数据。

但是客户端却可以用reader.readLine()!=null来作为读取数据的结束的判断条件。

为什么会是这样呢?待以后再追究原因,今天先用结论。

找着原因了,客户端之所有readLine.readLine()没有阻塞是因为服务端writer.close()把服务端输出流给关掉了,这时服务端socket就任务流结束了于是返回readLine.readLine()=null。由此可见已readLine.readLine()=null条件做跳出读取数据的判断不使用与服务端但使用与客户端,前提是服务端输出完毕后把流关了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值