无法同时写入和读取网络流 C#
Unable to write and read to a network stream at the same time c#
我有一个程序使用 TCPClient 和网络流从外部 IP 接收消息。消息不断发送,程序将这些消息转换为用户更易读的格式。
但是,IP 需要每 8 秒接收一次保持活动消息以保持连接打开。
我似乎很难同时读取消息和写入流。我的印象是,只要它们在不同的线程上,您就可以读取和写入流。
计时器结束后,调用写入保持活动消息的方法,我收到错误消息:无法从传输连接读取数据:已建立的连接被软件中止在您的主机中。 在调用写入流方法后试图读入一个字节时会发生此错误。
下面是我的代码。这是主要的:
public MainWindow()
{
InitializeComponent();
client.Connect(address, port);
nwStream = client.GetStream();
System.Timers.Timer newTimer = new System.Timers.Timer(8000);
newTimer.Elapsed += delegate { KeepAlive(nwStream, newTimer); };
newTimer.Start();
Thread t = new Thread(ReadInandOutputToTextBoxIfInvoke);
t.Start();
}
这是从流中读取的线程和方法:
private void ReadInandOutputToTextBoxIfInvoke()
{
while (run)
{
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];
我删除了那个翻译消息的方法的一部分,因为它不相关。
这是计时器结束时调用的代码:
private void KeepAlive(NetworkStream Ns, System.Timers.Timer MyTimer)
{
byte[] toSend = new byte[] { 35, 51, 49, 42, 124 };
try
{
for (int i = 0; i < toSend.Length; i++)
{
Ns.WriteByte(toSend[i]);
Ns.Flush();
}
}
catch
{
MyTimer.Close();
}
}
我现在已经解决了我的问题。有两个因素导致程序无法正常运行。
- 在我使用锁后错误不再出现。
- 我发送到设备的消息格式不正确 - 它必须是十六进制
现在可以完美运行了。感谢所有试图提供帮助的人。
我有一个程序使用 TCPClient 和网络流从外部 IP 接收消息。消息不断发送,程序将这些消息转换为用户更易读的格式。
但是,IP 需要每 8 秒接收一次保持活动消息以保持连接打开。
我似乎很难同时读取消息和写入流。我的印象是,只要它们在不同的线程上,您就可以读取和写入流。
计时器结束后,调用写入保持活动消息的方法,我收到错误消息:无法从传输连接读取数据:已建立的连接被软件中止在您的主机中。 在调用写入流方法后试图读入一个字节时会发生此错误。
下面是我的代码。这是主要的:
public MainWindow()
{
InitializeComponent();
client.Connect(address, port);
nwStream = client.GetStream();
System.Timers.Timer newTimer = new System.Timers.Timer(8000);
newTimer.Elapsed += delegate { KeepAlive(nwStream, newTimer); };
newTimer.Start();
Thread t = new Thread(ReadInandOutputToTextBoxIfInvoke);
t.Start();
}
这是从流中读取的线程和方法:
private void ReadInandOutputToTextBoxIfInvoke()
{
while (run)
{
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];
我删除了那个翻译消息的方法的一部分,因为它不相关。
这是计时器结束时调用的代码:
private void KeepAlive(NetworkStream Ns, System.Timers.Timer MyTimer)
{
byte[] toSend = new byte[] { 35, 51, 49, 42, 124 };
try
{
for (int i = 0; i < toSend.Length; i++)
{
Ns.WriteByte(toSend[i]);
Ns.Flush();
}
}
catch
{
MyTimer.Close();
}
}
我现在已经解决了我的问题。有两个因素导致程序无法正常运行。
- 在我使用锁后错误不再出现。
- 我发送到设备的消息格式不正确 - 它必须是十六进制
现在可以完美运行了。感谢所有试图提供帮助的人。