写一个c#socket通讯服务器,用同步接收并解决报文粘包示例
时间: 2024-02-03 17:12:50 浏览: 120
C# socket通信项目,实现了实现了心跳、断线重连、服务端异步接收数据、消息回调反馈、解决了粘包相关问题,可以多客户端
5星 · 资源好评率100%
以下是一个简单的C# socket通讯服务器示例,使用同步接收并解决报文粘包问题:
```csharp
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class Program
{
static void Main(string[] args)
{
// 创建socket,监听本地IP和指定端口
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipAddress = IPAddress.Any;
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 1234);
listener.Bind(localEndPoint);
// 开始监听
listener.Listen(10);
Console.WriteLine("Waiting for a connection...");
// 接受客户端连接
Socket handler = listener.Accept();
Console.WriteLine("Client connected");
// 循环接收数据
while (true)
{
byte[] buffer = new byte[1024];
int bytesRec = handler.Receive(buffer);
// 处理粘包问题
string message = Encoding.ASCII.GetString(buffer, 0, bytesRec);
string[] messages = message.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string msg in messages)
{
Console.WriteLine("Received: {0}", msg);
}
}
}
}
```
在此示例中,我们使用了一个简单的协议:每个消息以 CRLF (\r\n) 结尾。当我们接收到数据时,先将其转换为字符串,然后通过 CRLF 切割得到多条消息,最后逐一处理。这种方式可以解决报文粘包问题,因为我们假定每条消息都以 CRLF 结尾,因此不论粘在一起的数据长度如何,只要包含了完整的消息,我们就可以正确地解析出来。
阅读全文