【发布时间】: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