LuoLiKong
可以使用多线程或异步编程来提高并发性能和响应能力。
多线程:使用多线程可以允许多个任务同时执行,提高并发性能。可以使用Thread类或线程池来创建和管理线程。
以下是一个详细的多线程示例:
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
public class SocketServer
{
private Socket serverSocket;
private const int BufferSize = 1024;
private byte[] buffer = new byte[BufferSize];
public void Start()
{
// 创建Socket并绑定端口
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8888));
serverSocket.Listen(10);
// 创建新线程来执行接收消息的逻辑
Thread receiveThread = new Thread(ReceiveMessage);
receiveThread.Start();
Console.WriteLine("服务器启动,等待客户端连接...");
// 接收客户端连接
Socket clientSocket = serverSocket.Accept();
Console.WriteLine("客户端连接成功!");
// 继续执行其他操作
while (true)
{
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
clientSocket.Send(data);
}
}
private void ReceiveMessage()
{
while (true)
{
Socket clientSocket = serverSocket.Accept();
int length = clientSocket.Receive(buffer);
string message = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("收到客户端消息:" + message);
}
}
public void Stop()
{
serverSocket.Close();
serverSocket.Dispose();
}
}
public class Program
{
public static void Main(string[] args)
{
SocketServer server = new SocketServer();
server.Start();
}
}
在接收消息的逻辑中,可以使用循环和Receive方法接收消息,确保每个线程独立地处理消息。
异步编程:使用异步编程可以提高程序的响应能力,避免阻塞线程。可以使用async和await关键字,将Socket相关的操作封装为异步方法。以下是一个使用异步编程的示例:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
public class SocketServer
{
private Socket serverSocket;
private const int BufferSize = 1024;
private byte[] buffer = new byte[BufferSize];
public async Task StartAsync()
{
// 创建Socket并绑定端口
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8888));
serverSocket.Listen(10);
Console.WriteLine("服务器启动,等待客户端连接...");
// 接收客户端连接
Socket clientSocket = await serverSocket.AcceptAsync();
Console.WriteLine("客户端连接成功!");
// 开始接收消息
await ReceiveMessage(clientSocket);
// 继续执行其他操作
while (true)
{
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
await clientSocket.SendAsync(new ArraySegment<byte>(data), SocketFlags.None);
}
}
public async Task ReceiveMessage(Socket clientSocket)
{
while (true)
{
int length = await clientSocket.ReceiveAsync(new ArraySegment<byte>(buffer), SocketFlags.None);
string message = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("收到客户端消息:" + message);
}
}
public void Stop()
{
serverSocket.Close();
serverSocket.Dispose();
}
}
public class Program
{
public static async Task Main(string[] args)
{
SocketServer server = new SocketServer();
await server.StartAsync();
}
}
上述示例中,使用异步操作的ReceiveAsync方法避免了线程阻塞,在收到新消息时触发异步操作,并通过回调方法进行处理。这样可以提高系统的并发性能和响应能力。
但这样就要将Main改为异步方法,你可以看看Fantasy框架,在项目中把FTask复制过来,方便用FTask构建和调用异步方法。
课程只是一个基础的掌握,明白一些消息发送收,tcp,udp的核心机制。
但并不太具备实用性,要解决你上面遇到的这些问题,可考虑多线程,或者异步编程。
还涉及到线程同步,将消息同步到主线程等。
这课程达到学习目的后,应该去看fantasy框架,这样比较实用。