`
umbrellall1
  • 浏览: 145756 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

今天自己实现了下TCP处理粘包的问题

TCP 
阅读更多
用的是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);
	}
}


分享到:
评论

相关推荐

    【QT】自定义协议解决TCP粘包和拆包问题

    在某些需要精确控制数据传输的应用中,如游戏、实时通信等,解决TCP粘包和拆包问题是至关重要的。QT是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的网络编程接口,可以用来处理这个问题。 本文将...

    详细演示如何优雅处理TCP粘包C++源代码 包含完整项目资源确保可顺利编译运行

    本程序使用设计良好的函数,使得应用层不需要考虑网络消息是如何被接受和发送的,重点演示了如何优雅地处理TCP/IP网络数据粘包和丢包的刺手问题,你只要调用相应的函数就可以了。你只需要定义自己的协议头和消息...

    C#TCP\Socket粘包处理(加长度头)

    在TCP中处理粘包的关键是添加一种机制来区分不同的数据包。一种常见的方法是在每个数据包前添加一个“长度头”,这个长度头包含了接下来的数据包的字节数。这样,接收端在接收到数据后,可以通过读取长度头来知道接...

    QT/C++ TCP多线程客户端(收发线程分离,自动粘包处理,自动数据包成型)

    6. **代码组织**:`SmTClientTcp`可能包含了实现TCP客户端的核心代码,如连接管理、数据收发等逻辑。`SmTDemo`可能是客户端的示例应用或测试程序,展示了如何使用`SmTClientTcp`类进行实际操作。 在实际开发中,还...

    TCP粘包简单处理类

    这里我们介绍的是使用自定义的报文结构来处理粘包问题。报文结构通常包含一个头部和一个数据体,头部用来记录数据体的大小,这样接收端可以根据头部信息知道数据体的具体长度,从而准确地解包。 在提供的代码中,...

    unity实现Socket通讯(内含tcp粘包/拆包解决)

    在Unity中,我们通常使用System.Net.Sockets命名空间中的TcpClient和TcpListener类来实现TCP通信。首先,服务器启动一个TcpListener监听特定端口,等待客户端的连接请求;客户端则通过TcpClient对象尝试连接到服务器...

    Golang TCP粘包拆包问题的解决方法

    ### Golang TCP粘包拆包问题的解决方法 #### 一、引言 在使用Go语言进行网络编程时,特别是TCP编程过程中,经常会遇到所谓的“粘包”与“拆包”问题。这些问题的发生通常会影响到数据的正确性以及系统的稳定性。...

    tcp 粘包 拆包解决思路以代码

    这个DEMO可以帮助理解TCP粘包拆包的解决思路,并提供了实践代码实现,有助于深入理解网络编程中遇到的这类问题。 总的来说,TCP粘包和拆包是网络编程中常见的挑战,但通过合理的设计和编程技巧,我们可以有效地避免...

    TCP 粘包解决办法

    TCP粘包问题是网络通信开发中常见的问题之一,通过合理的封包和拆包策略可以有效避免粘包带来的数据解析错误。在实际应用中,开发人员可以根据具体的应用场景和需求选择合适的封包和拆包方案,以实现高效、稳定的...

    C# TCP粘包解决

    在提供的压缩包文件中,"TcpServer"和"TcpClient"可能是实现TCP服务器和客户端的代码示例。通过分析和学习这些代码,我们可以看到如何在实际项目中应用上述解决方案。例如,服务器端可能会创建一个监听套接字,等待...

    SuperSocket.ClientEngine.Core socket 客户端处理粘包半包

    通过以上内容,我们可以看到,SuperSocket.ClientEngine.Core提供了强大的工具来处理粘包和半包问题,使得开发者可以专注于业务逻辑,而不是底层网络通信的细节。在实际项目中,根据具体需求选择合适的方法,可以...

    Netty精粹之TCP粘包拆包问题

    4. **使用高级协议或框架**:如Netty框架提供了多种工具和机制来帮助开发者处理粘包、拆包问题。 #### 五、Netty中的粘包拆包处理 在Netty框架中,处理粘包、拆包问题通常涉及到几个重要的组件和机制: 1. **...

    Socket编程TCP粘包问题及解决方案.docx

    ### Socket编程TCP粘包问题及解决方案 #### 一、TCP粘包问题概述 TCP作为一种可靠的面向连接的传输层协议,提供了基于字节流的服务。在TCP传输过程中,发送方发送的数据被视为连续不断的字节流,而不是离散的消息...

    【游戏开发】网络编程之浅谈TCP粘包、拆包问题及其解决方案.docx

    ### 游戏开发中TCP粘包与拆包问题...综上所述,解决TCP粘包与拆包问题的关键在于设计合理的消息传输格式和处理机制。选择哪种方法取决于具体的应用场景和技术需求。开发者应根据项目的实际情况来选择最合适的解决方案。

    c#网络编程处理网络粘包问题

    9. **性能优化**:处理粘包的同时,还需要关注性能优化,如减少不必要的内存分配,合理设置TCP的缓冲区大小等。 通过以上这些方法,我们可以有效地处理C#网络编程中的粘包问题,保证数据的正确传输和解析。在实际...

    GOLANG语言实现SOCKET通讯粘包问题解决示例

    在TCP/IP通信中,"粘包"问题是一个常见的现象,主要出现在面向流的协议如TCP中。当多个数据包连续发送时,由于TCP的流水线特性,这些数据包可能会被合并成一个大的数据块,或者在接收端拆分不正确,导致接收方无法...

    Socket通信,通过异步,解决粘包问题

    所谓“粘包”,是指在网络传输过程中,由于TCP协议的流式特性,多个数据包可能会被合并成一个大的数据包进行传输,或者一个数据包被分割成多个小的数据包分别发送,导致接收方无法正确区分每个数据包的边界,从而...

    Node.js-NodeJs的TCP中的粘包分包问题的解决方案

    在Node.js中,`net`模块提供了TCP套接字的API,我们可以利用这些API来处理粘包和分包问题。例如,可以创建一个缓冲区,每次`data`事件触发时,都将接收到的数据追加到缓冲区,然后检查缓冲区内容是否包含完整的消息...

    C#实现Socket编程 (异步通讯,解决Tcp粘包)第三阶段

    在C#中,System.Net.Sockets命名空间提供了Socket类,它是实现TCP/IP通信的基础。 异步通讯是现代网络应用中的关键特性,因为它可以提高程序的响应性和效率。C#的Socket类提供了BeginConnect、BeginSend、...

    Boostasio异步TCP通讯及tcp粘包解包解决方案.doc

    本文档将详细介绍 Boostasio 异步 TCP 通讯的实现机制,以及 TCP 粘包解包的解决方案。 一、Boostasio异步TCP通讯 Boostasio异步TCP通讯是基于 Boost Asio 库实现的异步通讯机制。Boost Asio 库提供了一个异步I/O...

Global site tag (gtag.js) - Google Analytics