如何在SocketException之后重新启动网络流

时间:2015-02-27 15:18:04

标签: c# networkstream

我有一段代码从公共互联网上的服务器读取JSON流。我试图通过捕获异常并尝试在给定的时间间隔重新启动它来使连接更加健壮,但我还没有能够弄清楚如何重新启动它。

我的流代码如下

TcpClient connection = new TcpClient(hostname, port);
NetworkStream stream = connection.GetStream();

thread = new Thread(ProcessStream);
thread.Start(stream);

我的ProcessStream方法是

private void ProcessStream(object stream)
{
    Stream source = (NetworkStream)stream;
    byte[] line;
    int count;
    const int capacity = 300;
    ReadState readState;
    while ((readState = ReadStreamLine(source, out line, out count, capacity)) != ReadState.EOF && _stopFeed == false)
    {
        if (readState != ReadState.Error && count > 4)
        {
            byte[] line1 = new byte[count];
            Array.Copy(line, line1, count);
            Process(line1); // return ignored in stream mode                    
        }
        else
        {
            ReadFail(line, count);
        }
    }
}

我的ReadStream函数获取流s,执行s.ReadByte,然后在网络连接中断时捕获异常。在这里,我不知道如何尝试在定时的基础上重新启动流。网络恢复后,它不会自动重启。

4 个答案:

答案 0 :(得分:3)

这是不可能的。这就像你打电话给你的朋友,他在谈话中挂断了。无论你等多久,你都不会再听到他了。您所能做的就是挂断电话并再次拨打该号码。除非服务器支持可重新启动的下载(使用HttpWebRequest.AddRange),否则你必须从头开始再次下载json。

如果发生这种情况很多,那么服务器脱机或过载就无法解释,请记住服务器可能会故意这样做。通常是因为你超过了某种配额。与服务器所有者交谈,他们通常有一个付费计划,允许您使用更多资源。

答案 1 :(得分:0)

首先将您的流添加到运行流的静态列表中,然后在完成阅读后将其从那里删除。 记得使用锁定!

然后在NetworkGone-Catch中,您可以将列表复制到" todoAfterNetworkIsUpAgain" -List并启动一个检查网络的计时器,并在网络再次启动后重新开始再次读取流。

答案 2 :(得分:0)

据我所知,您可以在开始使用方法之前实例化TcpClient。因此,为了重新启动流,您需要在重试之前重新实例化或重新初始化连接流。

try 
{
     // Do something
}
catch (Exception ex)
{
    // Caught your exception, might be ideal to log it too
    // Have a count, if count is less than goal
    // Call your method again
    if (count < 5)
    {
        // re-initialize or re-instantiate connection
        TcpClient connection = new TcpClient(host, port);
        NetworkStream stream = connection.GetStream();
        ProcessStream(stream);
    }
}

我希望这会有所帮助。

答案 3 :(得分:-2)

这可能看起来有点凝灰岩但事实并非如此。

以更好的方式使用递归和线程,您的问题可能会得到解决

递归
http://www.dotnetperls.com/recursion

用于线程
查看msdn文档或从albahari获取概念