用c#写一个socket,使用多线程:使用多线程可以提高程序的并发处理能力。在接收数据时,可以使用一个线程专门负责接收数据,然后将数据存储到一个线程安全的队列中;而另一个线程则可以从队列中取出数据进行处理。这样可以避免接收数据和处理数据的操作相互影响,提高程序的并发处理能力。
时间: 2024-02-03 21:15:12 浏览: 193
C#.net同步异步SOCKET通讯和多线程总结
好的,以下是一个简单的使用多线程的C# Socket示例:
```csharp
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
public class SocketServer
{
private TcpListener listener;
private Thread listenThread;
private Thread receiveThread;
private bool isRunning;
private readonly object lockObj = new object();
private readonly Queue<string> messageQueue = new Queue<string>();
public SocketServer(int port)
{
listener = new TcpListener(IPAddress.Any, port);
}
public void Start()
{
isRunning = true;
listenThread = new Thread(ListenForClients);
listenThread.Start();
}
public void Stop()
{
isRunning = false;
listener.Stop();
}
private void ListenForClients()
{
listener.Start();
while (isRunning)
{
TcpClient client = null;
try
{
client = listener.AcceptTcpClient();
}
catch (SocketException)
{
// Ignore socket exceptions while stopping the server
if (!isRunning)
break;
}
if (client != null)
{
receiveThread = new Thread(ReceiveData);
receiveThread.Start(client);
}
}
}
private void ReceiveData(object clientObj)
{
TcpClient client = (TcpClient)clientObj;
NetworkStream stream = client.GetStream();
while (isRunning)
{
byte[] buffer = new byte[1024];
int bytesRead = 0;
try
{
lock (lockObj)
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
messageQueue.Enqueue(message);
}
}
}
catch (IOException)
{
// Ignore IO exceptions while stopping the server
if (!isRunning)
break;
}
}
stream.Close();
client.Close();
}
public void ProcessData()
{
while (isRunning)
{
string message = null;
lock (lockObj)
{
if (messageQueue.Count > 0)
message = messageQueue.Dequeue();
}
if (message != null)
{
// Process message here
}
else
{
Thread.Sleep(10);
}
}
}
}
```
在这个示例中,我们使用了一个 `TcpListener` 监听来自客户端的连接请求。当有新的客户端连接时,我们会启动一个新的线程来处理该客户端的数据。在这个线程中,我们将接收到的数据存储在一个线程安全的队列中。然后,我们可以使用另一个线程来处理队列中的数据。
需要注意的是,在处理队列中的数据时,我们需要使用一个锁来保证线程安全。我们还需要在关闭服务器时优雅地停止线程,以避免出现意外的异常。
阅读全文