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(