您的位置:首页 > 理论基础 > 计算机网络

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

2017-11-08 10:54 260 查看
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;
}
b3d8
public boolean isEnd(byte[] arr, int length){
return arr[length-1] == endFlag;
}


一直用-1判断结束都没出现问题,socket这里为什么就出现了阻塞呢?

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

不足之处,多指教
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket tcp 通信