写一个c#socket通讯服务器,用同步接收并解决粘包示例
时间: 2024-02-03 13:12:49 浏览: 150
以下是一个基本的C# Socket通讯服务器示例,其中包含了同步接收和解决粘包的处理逻辑:
```csharp
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class Server {
private static Socket listener;
public static void Main(string[] args) {
StartServer();
}
public static void StartServer() {
// 创建IP地址和端口号
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
int port = 12345;
// 创建监听器
listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(ipAddress, port));
listener.Listen(100);
Console.WriteLine("Server started and waiting for clients...");
while (true) {
// 等待客户端连接
Socket client = listener.Accept();
Console.WriteLine("Client connected: " + client.RemoteEndPoint.ToString());
// 处理客户端请求
byte[] buffer = new byte[1024];
int bytesReceived = client.Receive(buffer);
string message = Encoding.ASCII.GetString(buffer, 0, bytesReceived);
// 解决粘包
string[] messages = message.Split(new string[] { "<EOF>" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string m in messages) {
Console.WriteLine("Received message: " + m);
}
// 发送响应
byte[] response = Encoding.ASCII.GetBytes("Server response");
client.Send(response);
// 关闭连接
client.Shutdown(SocketShutdown.Both);
client.Close();
}
}
}
```
在这个示例中,我们使用了一个 `Split` 方法来将从客户端接收到的消息分割成多个消息。这个方法使用了 `<EOF>` 字符串作为分隔符,因此客户端发送的消息必须以该字符串结尾。如果不是以该字符串结尾,则会认为是粘包,并会将多个消息合并成一个。在实际应用中,可以根据具体的需求选择不同的分隔符或者使用其他方式来解决粘包问题。
阅读全文