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

来源:互联网 发布:asp公司网站源码 编辑:程序博客网 时间:2024/05/17 08:03

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,所以就出现阻塞了。
不足之处,多指教

阅读全文
0 0
原创粉丝点击