当前位置: 首页 > 知识库问答 >
问题:

如何为TcpClient设置超时?

江棋
2023-03-14

我有一个TcpClient,用于将数据发送到远程计算机上的侦听器。远程计算机有时打开,有时关闭。因此,TCP客户端将经常无法连接。我希望TcpClient在一秒钟后超时,这样当它无法连接到远程计算机时就不会花费太多时间。目前,我对TcpClient使用以下代码:

try
{
    TcpClient client = new TcpClient("remotehost", this.Port);
    client.SendTimeout = 1000;

    Byte[] data = System.Text.Encoding.Unicode.GetBytes(this.Message);
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    data = new Byte[512];
    Int32 bytes = stream.Read(data, 0, data.Length);
    this.Response = System.Text.Encoding.Unicode.GetString(data, 0, bytes);

    stream.Close();
    client.Close();    

    FireSentEvent();  //Notifies of success
}
catch (Exception ex)
{
    FireFailedEvent(ex); //Notifies of failure
}

这对于处理任务来说已经足够好了。如果可以,它会发送它,如果无法连接到远程计算机,它会捕获异常。然而,当它无法连接时,抛出异常需要10到15秒。我需要它在一秒钟内超时?我将如何更改超时时间?

共有3个答案

柴宏阔
2023-03-14

另一种替代方法使用https://stackoverflow.com/a/25684549/3975786:

var timeOut = TimeSpan.FromSeconds(5);     
var cancellationCompletionSource = new TaskCompletionSource<bool>();
try
{
    using (var cts = new CancellationTokenSource(timeOut))
    {
        using (var client = new TcpClient())
        {
            var task = client.ConnectAsync(hostUri, portNumber);

            using (cts.Token.Register(() => cancellationCompletionSource.TrySetResult(true)))
            {
                if (task != await Task.WhenAny(task, cancellationCompletionSource.Task))
                {
                    throw new OperationCanceledException(cts.Token);
                }
            }

            ...

        }
    }
}
catch(OperationCanceledException)
{
    ...
}
司徒高寒
2023-03-14

从开始。NET 4.5中,TcpClient有一个很酷的ConnectAsync方法,我们可以这样使用,所以现在非常简单:

var client = new TcpClient();
if (!client.ConnectAsync("remotehost", remotePort).Wait(1000))
{
    // connection failure
}
邓深
2023-03-14

您需要使用TcpClient的异步BeginConnect方法,而不是尝试同步连接,这正是构造函数所做的。类似这样:

var client = new TcpClient();
var result = client.BeginConnect("remotehost", this.Port, null, null);

var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1));

if (!success)
{
    throw new Exception("Failed to connect.");
}

// we have connected
client.EndConnect(result);
 类似资料:
  • 很容易说它是重复的,但它不是。 我读过许多关于如何在中设置连接超时的帖子,但是这些帖子已经有4-7年的历史了,我认为我们都需要更新这个主题,因为这些方法已经不被推荐或者不再存在了。 所以问题是,当我等待服务器的响应时,如何设置连接超时?

  • 问题内容: 我创建了以下函数来检查连接状态: 当我关闭服务器以测试执行情况时,会在网上等待很长时间 有谁知道如何设置超时以避免等待太久? 问题答案: 在我的示例中,设置了两个超时。连接超时抛出,套接字超时。 如果要设置任何现有HTTPClient的参数(例如或,则可以使用函数。

  • 我有一个简单的SpringBootConfigServer设置,还有一个客户端服务调用ConfigServer从GIT获取配置文件详细信息。 我的配置服务器工作正常,我能够从GIT获取prop文件。但是当我尝试运行消费者服务器时,它将从ConfigServer服务器获取详细信息,我得到一个错误。。。错误如下。。。 localhost:8888是我的configServer的URL,我可以直接从浏览

  • 问题内容: 我在Go中制作了一个URL提取程序,并具有要提取的URL列表。我将请求发送到每个URL并获得他们的响应。 如何为每个Get请求设置自定义超时?(默认时间很长,这会使我的提取程序非常慢。)我希望提取程序的超时时间为40-45秒左右,之后它应该返回“请求超时”并移至下一个URL。 我该如何实现? 问题答案: 显然在Go 1.3中,http.Client具有“超时”字段 这为我完成了窍门。

  • 我正在制作一个URL提取器,并有一个要提取的URL列表。我向每个URL发送请求并获取它们的响应。 如何为每个Get请求设置自定义超时?(默认时间很长,这使得我的取数器非常慢。)我希望我的提取器有一个大约40-45秒的超时,之后它应该返回“Request timed Out”并移动到下一个URL。 我怎样才能做到这一点呢?

  • 问题内容: 在selenium测试中,您可以使用 如何为selenium版本 3.8.0 和python 2.7.12 设置此命令的超时? 问题答案: 为设置 为 可以诱导 。 方法细节 精氨酸 用法 例 控制台输出 文献资料 您可以在 此处找到详细的讨论 深潜 按照Python, 如果我们不处理异常,则会观察到以下日志消息: