基于tcp协议的socket通信阻塞问题

tcp协议是可靠协议,就像打电话,打电话的一方拨完号之后,只有电话被接起双方才可以通讯。服务器端
ServerSocket serverSocket=new ServerSocket(port);
指定端口建立socket后就等待客户端来链接,客户端也建立socket指定要连接的远程主机和端口号,

 Socket socket = new Socket(InetAddress.getLocalHost(),5001);

一旦有客户端连到服务器,通过accept()方法就会获得一个新的Socket,用来和客户端进行通信

Socket socket = serverSocket.accept();

通过以下方法,

  InputStream is = socket.getInputStream();
  OutputStream os = socket.getOutputStream();

实现数据传输。然后就是客户端和服务器的通信了。阻塞的地方就是,

 while((n=is.read(b))!=-1){
  sb.append(new String(b));

  }

每次读的时候进入while就阻塞,后来加了标记

private final byte endFlag = 0x04;

每次写完就将笔记写到末尾

 os.write(endFlag);

然后读的时候就判断是否读到了结束标记就可以了

  while((n=is.read(b))!=-1){
      str += new String(b);
      if (isEnd(b, n)){
        break;
      }
      public boolean isEnd(byte[] arr, int length){
    return arr[length-1] == endFlag;
  }

一直用-1判断结束都没出现问题,socket这里为什么就出现了阻塞呢?
其实仔细想想不难发现,socket两端握手通过连接上以后,服务器和客户端都处在一种接收的状态,而此时可以通过其他线程来send数据到服务器或客户端,那么相应的那端就会收到数据,这就是双向通信,所以只要连接没有断开,那么流就一直联通的,所以尽管你read的时候可以read到数据,但是你并不知道后面还有没有,所以肯定到不了-1,所以就出现阻塞了。
不足之处,多指教

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值