写一个c#socket通讯服务器,用同步接收报文数据,并解决粘包
时间: 2024-02-03 18:14:20 浏览: 110
C# socket通信项目,实现了实现了心跳、断线重连、服务端异步接收数据、消息回调反馈、解决了粘包相关问题,可以多客户端
5星 · 资源好评率100%
下面是一个简单的C# Socket通讯服务器,使用同步方式接收报文数据并解决粘包问题:
```csharp
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class Server {
static void Main(string[] args) {
// 创建服务器Socket
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 监听端口
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 12345);
serverSocket.Bind(endPoint);
serverSocket.Listen(10);
Console.WriteLine("Server started.");
while (true) {
// 等待客户端连接
Console.WriteLine("Waiting for client...");
Socket clientSocket = serverSocket.Accept();
Console.WriteLine("Client connected.");
// 接收数据
byte[] buffer = new byte[1024];
int count = clientSocket.Receive(buffer);
// 解决粘包问题
string message = Encoding.UTF8.GetString(buffer, 0, count);
while (message.EndsWith("\r\n") == false) {
count = clientSocket.Receive(buffer);
message += Encoding.UTF8.GetString(buffer, 0, count);
}
Console.WriteLine("Message received: " + message);
// 发送数据
string response = "Hello, client!\r\n";
byte[] responseBuffer = Encoding.UTF8.GetBytes(response);
clientSocket.Send(responseBuffer);
// 关闭连接
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
Console.WriteLine("Client disconnected.");
}
}
}
```
在上面的代码中,我们使用了一个循环来解决粘包问题。当接收到的数据不是以“\r\n”结尾时,我们继续接收数据,并将它们拼接起来。直到接收到的数据以“\r\n”结尾时,我们认为一条完整的报文已经接收完成。
当然,这个解决粘包问题的方法并不完美,仅仅是一个简单的示例。在实际应用中,需要根据具体情况来选择更加合适的方法来解决粘包问题。
阅读全文