基于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
- 基于tcp协议的socket通信阻塞问题
- 基于TCP协议的Socket通信
- 基于TCP协议的Socket通信
- 基于TCP协议的Socket通信
- 基于TCP协议的socket通信
- 一对一的基于TCP协议的Socket通信
- linux下基于TCP协议的socket通信
- 基于TCP/IP协议下的Socket通信
- 基于TCP协议的网络通信(socket编程)
- 【Android学习笔记】基于TCP协议的Socket通信
- AVA实现基于Tcp协议的简单Socket通信实例
- Windows 网络编程基于TCP协议的Socket通信
- Java基于TCP/IP协议的Socket网络通信详解
- 基于Tcp协议的简单Socket通信实例(JAVA)
- 基于TCP协议的Socket通信(文件传输且续传)
- 基于Tcp协议的简单Socket通信实例(JAVA)
- 基于TCP协议的Socket通信实例(JAVA)
- 基于TCP的Socket通信
- [Redis学习笔记]-Spring 操作Redis
- CentOS6下Apache、MySql、PHP安装
- JAVA_50经典编程案例之题目:809*??=800*??+9*??+1其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
- POJ2955
- jsp自定义标签
- 基于tcp协议的socket通信阻塞问题
- 开源许可协议GPL、APL、BSD、LGPL、MIT等的区别
- 实录:余凯、颜水成、梅涛、张兆翔、山世光同台讨论 “深度学习的能与不能”
- Spring官网下载各版本jar包
- Android camera framework7.0和6.0 主要差异
- 明年的KPI就是写本书,书名暂定《Kafka实战》
- 人类记忆
- 男人知道这些,才能久战不泄!!!!
- SpringMVC 无法访问到controller的可能原因