C# TCP 客户端异步读取数据:实时返回结果并处理超时
以下是一个简单的示例代码,实现了 TCP 客户端异步读取数据的功能:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
public class TcpClientAsync
{
private const int Timeout = 5000; // 超时时间,单位毫秒
private readonly TcpClient _client;
private readonly NetworkStream _stream;
public TcpClientAsync(string host, int port)
{
_client = new TcpClient();
_client.Connect(host, port);
_stream = _client.GetStream();
}
public async Task<string> ReadAsync()
{
var buffer = new byte[1024]; // 读取缓冲区
var result = await _stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
if (result > 0)
{
return Encoding.UTF8.GetString(buffer, 0, result);
}
else
{
// 没有数据立即返回空字符串
return string.Empty;
}
}
public async Task<string> ReadWithTimeoutAsync()
{
var readTask = ReadAsync();
var timeoutTask = Task.Delay(Timeout);
var completedTask = await Task.WhenAny(readTask, timeoutTask).ConfigureAwait(false);
if (completedTask == readTask)
{
// 有数据立即返回结果
return await readTask.ConfigureAwait(false);
}
else
{
// 超时返回空字符串
return string.Empty;
}
}
public void Close()
{
_client.Close();
}
}
使用示例:
var client = new TcpClientAsync('127.0.0.1', 1234);
var result = await client.ReadWithTimeoutAsync();
client.Close();
在调用ReadWithTimeoutAsync方法时,会同时启动一个异步读取任务和一个超时任务。如果有数据到达,读取任务会立即返回结果;如果超时时间到达,超时任务会返回空字符串。注意,需要在读取完数据后调用Close方法关闭 TCP 连接。
原文地址: https://www.cveoy.top/t/topic/on0B 著作权归作者所有。请勿转载和采集!