用的是netty 的TCP服务框架 具体代码实现
package com.tongfang.forward.server.handler;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
public class MyTcpHandler extends ChannelHandlerAdapter {
static int count = 1;
byte[] bigdata=new byte[0];
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof ByteBuf) {
ByteBuf data = (ByteBuf) msg;
int bytes = data.readableBytes();
byte[] temp = new byte[bytes];
data.readBytes(temp);
//将读取到的字节保存
bigdata = combineByteArray(bigdata,temp);
//如果不满足协议最少4个字节的话就不处理
if(bigdata.length< 4){
System.out.println("不满足协议要求最少4个字节");
return;
}
//我这边定义的协议头是4个字节
byte[] lengByte = new byte[4];
System.arraycopy(bigdata, 0, lengByte, 0, 4);
//获取内容长度
int length = bytesToInt(lengByte);
System.out.println("协议长度为:"+length);
if(length > bigdata.length){
System.out.println("不满足协议长度要求要求");
return;
}
//判断获取到的数据能解析出来几个
int j = bigdata.length%(length+4)>0?bigdata.length/(length+4)-1:bigdata.length/(length+4);
for(int i= 0; i < j; i++){
byte[] head = new byte[4];
//获取长度
System.arraycopy(bigdata, 0, head, 0, 4);
int tempLength = bytesToInt(head);
byte[] temp2 = new byte[tempLength];
//获取内容
System.arraycopy(bigdata, 4, temp2, 0, tempLength);
String body = new String(temp2, "UTF-8");
export(body,count);
//去掉内容
bigdata = copyNewAry(bigdata,tempLength+4,bigdata.length-tempLength-4);
count++;
}
}
}
public void export(String str,int count){
FileWriter fw = null;
try {
File f=new File("E:\\data"+count+".txt");
if(!f.exists()){
f.createNewFile();
}
fw = new FileWriter(f, true);
PrintWriter pw = new PrintWriter(fw);
pw.println(str);
pw.flush();
fw.flush();
pw.close();
fw.close();
System.out.println("写入完成···");
} catch (IOException e) {
e.printStackTrace();
}
}
private byte[] copyNewAry(byte[] array,int start,int length){
byte[] newAry = new byte[length];
System.arraycopy(array, start, newAry, 0, newAry.length);
return newAry;
}
private static byte[] combineByteArray(byte[] array1, byte[] array2) {
byte[] combined = new byte[array1.length + array2.length];
System.arraycopy(array1, 0, combined, 0, array1.length);
System.arraycopy(array2, 0, combined, array1.length, array2.length);
return combined;
}
public int bytesToInt(byte[] bArr) {
if(bArr.length!=4){
return -1;
}
return (int) ((((bArr[0] & 0xff) << 24)
| ((bArr[1] & 0xff) << 16)
| ((bArr[2] & 0xff) << 8)
| ((bArr[3] & 0xff) << 0)));
}
public static void main(String[] args) {
System.out.println(1024%252);
}
}
分享到:
相关推荐
本demo模拟了TCP通信中发送端和接收端的行为,并利用序列化和反序列化的思想,自定义协议来解决TCP的粘包和拆包问题。
本程序使用设计良好的函数,使得应用层不需要考虑网络消息是如何被接受和发送的,重点演示了如何优雅地处理TCP/IP网络数据粘包和丢包的刺手问题,你只要调用相应的函数就可以了。你只需要定义自己的协议头和消息...
资料文件用于解决C#编程中发生的粘包问题的处理
通过socket通讯实现服务器与客户端的连接。首先服务器利用udp广播发送自己的ip地址,客户端在收到广播后通过此ip以tcp连接的方式连接服务器来通讯。
使用多线程接受消息和发送消息分开的思想,保证了程序内置自动消息处理过程,做到消息可靠高并发的效果
什么是粘包拆包,为什么发生拆包粘包问题,如何处理拆包粘包问题
一个基于WPF + SuperSocket的TCP长连接小...处理粘包的唯一方法就是制定应用层的数据通讯协议,通过协议来规范现有接收的数据是否满足消息数据的需要。 解决办法: 1. 消息定长:报文大小固定长度,不够空格补全,发送
新手,代码很简单,却费了不少时间,总算实现了基本功能!
我们可以采用.NET自带的类库编写,但是由于这些类库只是基础的设施,需要自行处理比如断线重连、网络波动、tcp粘包等等问题,并且还要考虑稳定性和吞吐等因素,所以可以调用一些类库。 这里介绍一个比较稳定可靠,又...
基本实现原理: 1)粘包和拆包采用帧头里面加长度信息来做; 2)超时机制:采用一个单独的线程来判断,每次收到数据就更新接收时间。在单独的线程里面判断如果当前时间减去上次接收的时间超过20秒则认为超时,关闭...
XAndroidSocket Socket封装,支持TCP/UDP客户端和服务端,支持自定义粘包处理、验证处理、解析处理。 使用 详见目录TCP/UDP使用demo 下的例子,使用简单。 其中只有TCP才支持支持...支持自定义粘包处理,只需要实现Ab
在使用上传统Socket编写tcp应虽然不是复杂但写起来也是件麻烦的事情,还要处理分包和粘包上的问题。但beetle都解决了以上问题,所有操作都是基于方法和事件来实现,只需要在便建一个对象简单的绑定一个事件就能完成...
vertx3-tcp-samples 使用vertx3框架。 并使用tcp(netserver)协议连接某物。
该通讯助手使用Qt+C++实现的通讯助手,可以实现客户端、服务端的模拟,可以收发通讯内容。但未进行粘包处理,以及进制转换,仅供参考学习。
如稳定性方面,连接池的释放,发送方面没有考虑只发送出半包的情况,优雅和非优雅关闭处理的问题,性能方面如内存池的选择,逻辑处理上TCP粘包处理,本组件完美的解决了这些问题,通过不同的参数配置,可适用于不同...
* 实现前后端二进制封包解包,采用的是msgpack扩展,msgpack对数据进行了压缩,并实现粘包处理, 服务器加入了protobuf支付,tcp有测试例子 * 数据采用固定包头,包头4个字节存包体长度,包体前2个字节分别为cmd(主...
基于QT的socket TCP协议通信示例,包含客户端与服务端,实现了多线程、心跳机制、断线重连,数据简单封包(防止粘包)等必备技巧,已经封装为独立的类,可以移植性强,只需要添加自己的数据解析与处理即可直接使用。
首先写一个公共类,用字典的形式对数据的收发,并且进行封装,导入struct解决了TCP的粘包问题,并在公共类中进行了异常处理 import socket,struct,json def send_dic(c,dic): dic_json=json.dumps(dic) dic_json_...
per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 readn writen 回射客户/服务器 10socket编程(五) read、write与recv、send readline实现 用readline实现回射...
粘包处理方案 readn writen 回射客户/服务器 10socket编程(五) read、write与recv、send readline实现 用readline实现回射客户/服务器 getsockname、getpeername gethostname、gethostbyname、...