JAVA基于Socket的通讯模型(长度+数据)

从程序猿到程序员 2017-09-30 06:55:52
目前工程缺少通讯模块,考虑到传输的数据挺长的,包含BASE64压缩的图片的JSON串。
在以前的项目中经常会出现少包、粘包现象。
现在考虑使用8个字节的long代表长度。接收指定长度的byte,这样可以解决粘包、少包问题么?
Server.java
ServerSocket ss = new ServerSocket(11111);
Socket s = ss.accept();
InputStream is = s.getInputStream();
DataInputStream dis = new DataInputStream(is);
long dataLen = dis.readLong();
long dataSum = 0;
int dataTmplen = 0;
byte[] data=new byte[0];
byte[] dataTmp = new byte[1024];
while ((dataTmplen = is.read(dataTmp)) != -1) {
dataSum += dataTmplen;
data = ByteArrayUtil.addBytes(data, dataTmp, dataTmplen);//拼接byte数组
if (dataSum == dataLen) {
break;
}
}
System.out.println(dataLen);

Client.java
Socket socket = new Socket("127.0.0.1", 11111);
OutputStream os = socket.getOutputStream();
// 字符串转byte[]
FileInputStream fis = new FileInputStream(new File("D:\\文档\\本科备份\\照片.jpg"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
new BASE64Encoder().encode(fis, baos);
byte[] data = baos.toByteArray();
baos.reset();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeLong(data.length);
byte[] dataLen = baos.toByteArray();
byte[] sendData = ByteArrayUtil.addBytes(dataLen, data, data.length);
// 发送数据长度(4字节)+数据
os.write(sendData);
os.flush();
os.close();
socket.close();


...全文
298 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
双向,主要不太熟悉HTTP,我学习一下,谢谢了。
tianfang 2017-10-07
  • 打赏
  • 举报
回复
你要求的是单向还是双向传输? base64传输二进制信息,浪费了25%的带宽,6bit信息编码到8bit,不是好方法。http支持文件传输,已经做的很好了,为什么还有单独做

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧