【问题标题】:Network stream seems to stop reading?网络流似乎停止阅读?
【发布时间】:2018-01-12 03:05:37
【问题描述】:

我有一个程序,它使用 TCPClient 和网络流从 ip 和端口读取数据。消息不断快速发送到程序。该程序旨在读取这些消息,并翻译这些消息,以便将发送的信息显示为用户更易读的格式。

这似乎工作正常 - 大约 60 秒。由于某种原因,它似乎停止阅读消息。不显示错误消息,只是没有新消息通过。当我停止并启动程序时,它再次正常工作,直到一分钟左右。

以下是我使用的代码。希望您能够看到我可能出错的地方,这可能导致流停止接收新消息。主要是:

public MainWindow()
{
    InitializeComponent();

    client.Connect(address, port); //client, address and port are declared as public and static

    connected = true;

    if (connected == true)
    {
        readInTxtBox.Text = "Connected";
    }


    Thread t = new Thread(ReadInandOutputToTextBoxIfInvoke);
    t.IsBackground = true;
    t.Start(); //the thread is where the messages are read in
}

这就是方法:

private void ReadInandOutputToTextBoxIfInvoke()
{
    while (true)
    {
        string message = "";
        int x = 0;
        int start = 35;
        int messageLength;
        int numberOfMessages;
        NetworkStream nwStream = client.GetStream();
        try
        {
            while ((x = nwStream.ReadByte()) != start) { if (x == -1) { continue; } } //if it doesnt begin with # or has gone over then break

            //reads in message header which is length then number of messages
            messageLength = nwStream.ReadByte();
            numberOfMessages = nwStream.ReadByte();

            string messageRecieved = new string(readMessage(nwStream, messageLength - 1));
            string[] messages = messageRecieved.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);


            for (int i = 0; i < numberOfMessages; i++)
            {
                string messageToProcess = messages[i];
                char messageType = messageToProcess[0];
                switch (messageType)
                {
                    case 'h':
                        try
                        {
                            heightMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
                        }
                        catch { }
                        break;
                    case 'l':
                        try
                        {
                            longWarpHeightMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
                        }
                        catch { }
                        break;
                    case 's':
                        try
                        {
                            status.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
                        }
                        catch { }
                        break;
                    case 'r':
                        try
                        {
                            calibrateMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
                        }
                        catch { }
                        break;
                    default:
                        break;
                }
            }

case 语句只是翻译消息,因此可能无关紧要。

更新 - 我在我的 catch 语句中添加了一个 console.writeline 来输出任何错误并且似乎没有发生错误。请参阅下面我所做的编辑:

switch (messageType)
{
    case 'h':
        try
        {
            heightMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
        }
        catch (Exception e)
        { Console.WriteLine(e.ToString()); }
        break;
    case 'l':
        try
        {
            longWarpHeightMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
        }
        catch(Exception e) { Console.WriteLine(e.ToString());  }
        break;
    case 's':
        try
        {
            status.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
        }
        catch(Exception e) { Console.WriteLine(e.ToString());  }
        break;
    case 'r':
        try
        {
            calibrateMsg.Translate(Utilities.ConvertHexStringToByteArray(messageToProcess.Substring(1)));
        }
        catch(Exception e) { Console.WriteLine(e.ToString());  }
        break;
    default:
        break;
}

【问题讨论】:

  • 好吧,我会开始删除所有那些对你隐藏任何错误的空catch块。 (如果出现问题,您是否真的想在没有任何问题迹象的情况下继续前进?)
  • 会不会导致网络流停止读取?
  • 尝试使用 Console.Writeline 来跟踪问题出在哪里。如果您有需要处理的变量或任何变量,还可以监控您的项目性能。以及您的网络。
  • @LucyCopp:它可能读得很好,只是由于吞下异常而无法以您看不到的方式处理消息。你说“没有显示错误消息”——这很可能是因为你正在吞下所有的异常......
  • 我添加了一个console.writeline来输出任何异常,似乎没有出现错误

标签: c# network-programming tcpclient networkstream


【解决方案1】:

问题原来是我正在与之通话的设备必须在一定时间内收到保持活动消息,否则它会关闭连接。它现在可以工作了 - 我每 8 秒向它发送一条保持活动消息。

【讨论】:

    猜你喜欢
    • 2016-04-15
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2021-06-13
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多