Unity丛林战争学习02_TCP_解决分包和黏包的问题

1.分包和黏包
分包:当发送的消息过长时会出现分包的情况,即一个消息分多次接收。
黏包:当发送的消息过短时会出现黏包的情况,即多个消息合在一起接收。

2.导致的问题
分包:UTF-8 使用一至四个字节为每个字符编码,比如有一个字符有三个自己,它的一个字节被分包到了上一个包中,另外两个字节被分配到下一个包中,这样每接收一个包后使用System.Text.Encoding.UTF8.ToString之后,就会出现上一个包结尾出现乱码,下个包开头出现乱码的情况
黏包:接收方不知道一次提取多少个字节。

3.改进思路
思路:发送方每次发送消息的时候在消息前面加上一个int类型的数据,表示该消息的长度,接收方就可以根据该int数据进行提取后面对应长度,转换为字符串。

4.发送方(客户端)

定义下面这样一个类,给每一条消息前面加上长度信息(int):

	class Message
	{
   
		public static byte[] PackageData(string message)
		{
   
			byte[] originalByte = Encoding.UTF8.GetBytes(message);
			byte[] sizeByte = BitConverter.GetBytes(originalByte.Length);
			return (sizeByte.Concat(originalByte).ToArray());
		}
	}

发送的时候就可以发送处理好的消息,即:

clientSocket.Send(Message.PackageData(sendMessage));

整个客户端代码

Message类(处理消息:给消息前加上长度)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace clientProject
{
   
	class Message
	{
   
		public static byte[] PackageData(string message)
		{
   
			byte[] originalByte = Encoding.UTF8.GetBytes(message);
			byte[] sizeByte = BitConverter.GetBytes(originalByte.Length);
			return (sizeByte.Concat(originalByte).ToArray());
		}
	}
}

Program.cs(对处理好的消息进行发送)

using System;
using System.Net.Sockets;
using System.Net;

namespace clientProject
{
   
	class Program
	{
   
		static void Main(string[] args)
		{
   
			//创建客户端套接字
			Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
			//连接服务器
			clientSocket.Connect(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值