gpt4 book ai didi

c# 套接字处理多个客户端

转载 作者:可可西里 更新时间:2023-11-01 02:30:34 25 4
gpt4 key购买 nike

我有以下代码,我想将其实现为我的服务器。据我了解,它是异步的。并且应该允许来自多个客户端的连接...

public void Start()
{
TcpListener listener = new TcpListener(IPAddress.Any, 10250);
listener.Start();
Console.WriteLine("Listening...");

while (true)
{
IAsyncResult res = listener.BeginAcceptTcpClient(HandleAsyncConnection, listener);
connectionWaitHandle.WaitOne();
}
}

private void HandleAsyncConnection(IAsyncResult res)
{
TcpListener listener = (TcpListener)res.AsyncState;
TcpClient client = listener.EndAcceptTcpClient(res);
connectionWaitHandle.Set();

StringBuilder sb = new StringBuilder();
var data = new byte[client.ReceiveBufferSize];

using (NetworkStream ns = client.GetStream())
{
// Test reply
Byte[] replyData = System.Text.Encoding.ASCII.GetBytes(DateTime.Now.ToString());
ns.Write(replyData, 0, replyData.Length);
ns.Flush();
ns.Close();
}

client.Close();
}

我有一个测试应用程序,它只是向我的服务器发送请求。正如您在代码中看到的那样,服务器仅回复其日期/时间。测试应用程序发送了 20 个简单的测试字符串请求。对于这些请求中的每一个,它都会打开一个套接字,将数据发送到我的服务器,然后再次关闭套接字。

这在运行一个测试应用程序时效果很好。但是,如果我打开两个测试应用程序,第二个无法连接到服务器。我以为是因为我正在处理异步请求。因为我的测试应用程序在每次调用之前打开然后关闭套接字,所以我可以处理来自多个客户端的请求?

最佳答案

编辑

如果使用 >=.Net4.5,最好使用新的网络方法,然后允许采用 asyncawait。因此,最好遵循我在 this post 中提供的示例作为起点。

原帖

下面的代码演示了如何在不为每个连接创建新线程的情况下异步接受多个客户端。

private TcpListener listener;
public void Start()
{
listener = new TcpListener(IPAddress.Any, 10250);
listener.Start();
Console.WriteLine("Listening...");
StartAccept();

}
private void StartAccept()
{
listener.BeginAcceptTcpClient(HandleAsyncConnection, listener);
}
private void HandleAsyncConnection(IAsyncResult res)
{
StartAccept(); //listen for new connections again
TcpClient client = listener.EndAcceptTcpClient(res);
//proceed

}

您可以将此模式用于大多数异步操作。

关于c# 套接字处理多个客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5742577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com