socket通讯时出现大包
正常情况下包的长度是9~500左右的长度的,后台基本不会发来大包,后台发送日志也是正常的,但是android 端就经常出现这个情况,要怎么处理,看了网上的文章,说是粘包,也提到一些思路,我这边是用自定义协议的,结合我的项目用代码实现思路也不清晰,希望大神路过指点一二。
下面是错误信息
下面是代码:代码有点乱,还没做整理,这个是TcpSocket实现Runnable的run方法:
错误的是出现在上面代码的第40行
下面是错误信息
java.lang.OutOfMemoryError: Failed to allocate a 842019138 byte allocation with 16777216 free bytes and 481MB until OOM
at fuhao.com.app.net.TcpSocketZ$ReceiveThread.run(TcpSocketZ.java:255)下面是代码:代码有点乱,还没做整理,这个是TcpSocket实现Runnable的run方法:
@Override
public synchronized void run() {
try {
int packetLen = 0;
while (isRunning) {
if (!isConnected) {
mSocket = new Socket(HostIP, Port);
mSocket.setSendBufferSize(1024);
mSocket.setReceiveBufferSize(1024);
mSocket.setTcpNoDelay(true);
mSocket.setKeepAlive(true);
mDos = new DataOutputStream(mSocket.getOutputStream());
mDis = new DataInputStream(mSocket.getInputStream());
handshark();
isConnected = true;
startHeartBeat();
} else {
if (mDis.available() >= 4) {
packetLen = mDis.readInt();
L.e("TcpSocketZ", "-----packetLen------" + packetLen);
if (packetLen > 0) {
byte iszlib = mDis.readByte();
if (iszlib == (byte) 1) {
try {
byte[] inputData = new byte[packetLen - 1];
utils.readData(mDis, inputData, 0, packetLen - 1);
byte[] result = CompressUtil.decompress(inputData);
byteReader br = new byteReader(result);
int alias = br.readInt();
L.e("TcpSocketZ", "recv packet zlib ------" + String.valueOf(alias));
baseProto obj = ClassFactory.getProtoObject(alias);
if (obj != null) {
obj.parseFrom(br);
EventBus.getDefault().post(new ResEvent(obj));
}
} catch (DataFormatException e) {
e.printStackTrace();
}
} else {
byte[] inputData = new byte[packetLen - 1];
utils.readData(mDis, inputData, 0, packetLen - 1);
byteReader br = new byteReader(inputData);
int alias = br.readInt();
L.e("TcpSocketZ", "packet alias------" + String.valueOf(alias));
if (alias == 20002) {
backTime = 0;
}
baseProto obj = ClassFactory.getProtoObject(alias);
if (obj != null) {
obj.parseFrom(br);
EventBus.getDefault().post(new ResEvent(obj));
}
}
}
}
}
}
mDos.close();
mDis.close();
if (mSocket != null) {
mSocket.close();
mSocket = null;
}
this.isRunning = false;
reconnect();
} catch (EOFException e) {
this.isConnected = false;
try {
mDos.close();
mDis.close();
if (mSocket != null) {
mSocket.close();
mSocket = null;
}
} catch (IOException e1) {
e1.printStackTrace();
}
reconnect();
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
this.isConnected = false;
try {
mDos.close();
mDis.close();
if (mSocket != null) {
mSocket.close();
mSocket = null;
}
} catch (IOException e1) {
e1.printStackTrace();
}
reconnect();
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
this.isConnected = false;
try {
mDos.close();
mDis.close();
if (mSocket != null) {
mSocket.close();
mSocket = null;
}
} catch (IOException e1) {
e1.printStackTrace();
}
reconnect();
e.printStackTrace();
} catch (IOException e) {
this.isConnected = false;
try {
mDos.close();
mDis.close();
if (mSocket != null) {
mSocket.close();
mSocket = null;
}
} catch (IOException e1) {
e1.printStackTrace();
}
reconnect();
e.printStackTrace();
}
}错误的是出现在上面代码的第40行
...全文
相关推荐
C#实现Socket编程 (异步通讯,解决Tcp粘包)第三阶段
在TCP协议中,由于其流式传输的特性,多个小的数据包可能会被合并成一个大包发送(粘包),或者一个大包会被拆分成多个小包发送(拆包)。这在解析数据时可能导致问题。
Python搭建即时通讯系统
在本文中,我们将深入探讨如何使用Python搭建一个即时通讯系统,重点关注C/S(客户端/服务器)架构、socket编程、粘包分包处理、多线程以及心跳检测等关键概念。
Linux下用C++实现Socket通信
**接受连接**:当有客户端请求连接时,服务器端调用`accept()`函数接收连接,并返回一个新的Socket用于与客户端通信。5.
基于Socket的多对多网络聊天
【标签】:“网络聊天”、“计算机网络”【正文】:在计算机网络领域,即时通讯系统因其实时性和便捷性受到了广泛的应用。
发那科机器人与视觉socket通讯
在FANUC机器人与视觉系统通讯中,IO信号可能用来同步机器人的运动与视觉检测的结果,例如当视觉系统检测到目标工件时,发送一个信号给机器人启动抓取动作。8.


Java SE

