linux下使用java socket通信的broken pipe问题


虽说java是跨平台的,但是同一段代码在windows和linux执行还是会有差异。遇到的问题就是使用TCP/IP socket给服务端发送数据(每秒30条以上,每条数据10M左右),会报出java.net.SocketException: Broken pipe。而在windows下同样代码没有任何问题。因为本人对linux了解甚少(只会一些常用命令),所以在google上找到一些关于这个问题的结果都是与linux信号量有关,看似说此种异常不能避免,请教这里的高手们,是否有此相关经验,请告知,不胜感激。

java socket

专虐蓝路路 10 years, 10 months ago

每秒30条以上,每条数据10M左右? 是什么网卡100Mbps的么?还是1000Mbps的。100M/8=12.5 1000/8=125M 都达不到这样的速度, 每条10M*30=300M
SSD的STAT3盘刚达到每秒这样的速度啊.测试的环境有么?是windows发linux还是。。。关于SIGPIPE信号http://blog.sina.com.cn/s/blog_502d765f0100kopn.html 我也是找到的。我觉得大的可能是超时了吧。通过tcpdump抓下包,查看下发送的过程。这么大的传输是需要上层协议来规避错误的,比如说定义协议
头 16字节
command 4 //请求命令
length 4 //数据长度 包头+包体
seqid 4 //数据请求ID唯一,做异步回调用
result 4 //执行结果,请求为0,应答成功为0,其它为失败

体FileUpload_Req
fileSize 4 //数据总大小
packSize 4 //包大小
fileName 20 //数据标实

体FileUpload_Resp
dataid 4 //服务器端数据ID

体FileDataStream
dataid 4 //服务器端数据ID
startIndex 4 //开始位置
endIndex 4 //结束位置
bytedata datalength //真实数据 结束位置-开始位置

体FileDataStream_Resp
startIndex 4 //开始位置
endIndex 4 //结束位置

体CheckFile_Req
md5Str 32 //Md5验证串

体CheckFile_Resp
startIndex 4 //开始位置
endIndex 4 //结束位置

command=0x00000001 请求允许传输 请求
command=0x00000002 传输数据 请求
command=0x00000003 验证 请求

command=0x80000001 请求允许传输 应答
command=0x80000002 传输数据 应答
command=0x80000003 验证 应答

Client -> Server 连接成功
command=0x00000001 -> Server 查看空间允许、创建文件等等。。。
command=0x80000001 <- Server 允许并返回ID
command=0x00000002 -> Server 发送数据1
command=0x00000002 -> Server 发送数据2
command=0x00000002 -> Server 发送数据3
command=0x80000002 <- Server 发送数据1应答
command=0x80000002 <- Server 发送数据2应答
command=0x80000002 <- Server 发送数据3应答
比如连接断开出现broken pipe,重新连接
command=0x00000002 -> Server 发送数据4
command=0x00000002 -> Server 发送数据5
command=0x00000002 -> Server 发送数据6
command=0x80000002 <- Server 发送数据4应答
command=0x80000002 <- Server 发送数据5应答
command=0x80000002 <- Server 发送数据6应答

command=0x00000003 -> Server 验证MD5(数据)
command=0x80000003 <- Server 接收MD5(数据)如果完整,返回0传输成功,其它失败,服务器端会告知数据哪儿未完成。
command=0x00000002 -> Server 发送数据4
command=0x00000002 -> Server 发送数据5
command=0x00000002 -> Server 发送数据6
command=0x80000002 <- Server 发送数据4应答
command=0x80000002 <- Server 发送数据5应答
command=0x80000002 <- Server 发送数据6应答
command=0x00000003 -> Server 验证MD5(数据)
command=0x80000003 <- Server 返回0.

Seeiya answered 10 years, 10 months ago

Your Answer