基于tcp协议的socket通信阻塞问题
2017-11-08 10:54
260 查看
tcp协议是可靠协议,就像打电话,打电话的一方拨完号之后,只有电话被接起双方才可以通讯。服务器端
指定端口建立socket后就等待客户端来链接,客户端也建立socket指定要连接的远程主机和端口号,
一旦有客户端连到服务器,通过accept()方法就会获得一个新的Socket,用来和客户端进行通信
通过以下方法,
实现数据传输。然后就是客户端和服务器的通信了。阻塞的地方就是,
每次读的时候进入while就阻塞,后来加了标记
每次写完就将笔记写到末尾
然后读的时候就判断是否读到了结束标记就可以了
一直用-1判断结束都没出现问题,socket这里为什么就出现了阻塞呢?
其实仔细想想不难发现,socket两端握手通过连接上以后,服务器和客户端都处在一种接收的状态,而此时可以通过其他线程来send数据到服务器或客户端,那么相应的那端就会收到数据,这就是双向通信,所以只要连接没有断开,那么流就一直联通的,所以尽管你read的时候可以read到数据,但是你并不知道后面还有没有,所以肯定到不了-1,所以就出现阻塞了。
不足之处,多指教
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,所以就出现阻塞了。
不足之处,多指教
相关文章推荐
- java服务器端和C客户端基于socket通信IO阻塞问题
- JAVA实现基于Tcp协议的简单Socket通信实例
- Android中基于TCP协议的网络通信之使用Socket进行通信
- Android中基于TCP协议的网络通信之使用Socket进行通信
- 基于TCP协议的Socket通信
- Python网络通信之黏包问题(五)基于SocketServer模块和socket模块
- 基于非阻塞socket的多线程服务器的实现------一个服务器如何与多个客户端进行通信?
- QTcpSocket通信编程时阻塞与非阻塞的问题
- 基于Tcp协议的简单Socket通信实例(JAVA)
- Android基础入门教程——7.6.2 基于TCP协议的Socket通信(1)
- 基于TCP协议的Socket通信 实现用户登录 以及服务端的相应
- JAVA Socket应用学习——基于TCP协议实现的网络通信
- Android基础入门教程——7.6.3 基于TCP协议的Socket通信(2)
- 基于TCP协议的Socket通信(文件传输且续传)
- C++与Java使用SOCKET通信遇到的一种阻塞问题的解决
- 基于tcp协议的socket客户端与服务端的通信-java
- 基于TCP协议的Socket通信实例(JAVA)
- 基于Tcp协议的简单Socket通信实例(JAVA)
- Socket 通信中由 read 返回值造成的的死锁问题(socket 阻塞)
- java分布式开发TCP/IP NIO无阻塞 Socket((基于消息方式实现系统间的通信) )(转)