gpt4 book ai didi

c# - 接受 TCP 客户端异步

转载 作者:可可西里 更新时间:2023-11-01 02:31:42 26 4
gpt4 key购买 nike

我一直在做服务器。我在 async 方法中使用 TcpListener.AcceptTcpClientAsync(),但我不知道如何让它真正起作用。我现在的代码是:

private static async void StartServer()
{
Console.WriteLine("S: Server started on port {0}", WebVars.ServerPort);
var listener = new TcpListener(WebVars.LocalIp, WebVars.ServerPort);
listener.Start();
var client = await listener.AcceptTcpClientAsync();
}

我如何处理客户?我是继续编码,它会自动创建相同方法的新线程,还是我需要做一些神奇的方法来为我做这件事?

编辑:当前代码:

private static Task HandleClientAsync(TcpClient client)
{
var stream = client.GetStream();
// do stuff
}
/// <summary>
/// Method to be used on seperate thread.
/// </summary>
private static async void RunServerAsync()
{
while (true)
{
Console.WriteLine("S: Server started on port {0}", WebVars.ServerPort);
var listener = new TcpListener(WebVars.LocalIp, WebVars.ServerPort);
listener.Start();
var client = await listener.AcceptTcpClientAsync();
await HandleClientAsync(client);
}
}

最佳答案

//简而言之,所有功劳都应归功于 c# 7.0(Joseph Albahari 和 Ben Albahari)

    async void RunServerAsync()
{
var listner = new TcpListener(IPAddress.Any, 9999);
listner.Start();
try
{
while (true)
await Accept(await listner.AcceptTcpClientAsync());
}
finally { listner.Stop(); }
}


const int packet_length = 2; // user defined packet length

async Task Accept(TcpClient client)
{
await Task.Yield();
try
{
using(client)
using(NetworkStream n = client.GetStream())
{
byte[] data = new byte[packet_length];
int bytesRead = 0;
int chunkSize = 1;

while (bytesRead < data.Length && chunkSize > 0)
bytesRead += chunkSize =
await n.ReadAsync(data, bytesRead, data.Length - bytesRead);

// get data
string str = Encoding.Default.GetString(data);
Console.WriteLine("[server] received : {0}", str);

// To do
// ...

// send the result to client
string send_str = "server_send_test";
byte[] send_data = Encoding.ASCII.GetBytes(send_str);
await n.WriteAsync(send_data, 0, send_data.Length);

}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}

关于c# - 接受 TCP 客户端异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22190536/

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