TcpClient发送/关闭问题

3

我需要关闭连接才能确保消息被发送吗?因为无论是使用发送命令还是使用网络流,我的消息都没有被处理,直到我关闭连接。这是应该这样的方式还是我错过了什么?

好的,下面是代码。

private void connectButton_Click(object sender, EventArgs e)
{
   try
   {
      client = new TcpClient();
      client.Connect(ip, port);
      netStream = client.GetStream();
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message);
   }
}

private void disconnectButton_Click(object sender, EventArgs e)
{
   if (client != null)
   {
      if (client.Connected)
      {
         client.Close();
         client = null;
      }
   }
}

private void sendButton_Click(object sender, EventArgs e)
{
   byte[] cmd = ToByteArray("bla bla bla");
   netStream.Write(cmd, 0, cmd.Length);
   netStream.Flush();
}

我不认为这与这种方法有关,但是请看一下。

public static byte[] ToByteArray(string str)
{
   System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
   return encoding.GetBytes(str);
}

你正在使用哪些类?+ 粘贴一个代码示例。 - AK_
1
你的所有代码都属于我们。 - jgauffin
ToByteArray看起来是什么样子? - SwDevMan81
可能是监听该端口的软件出了问题。我不想无故浪费任何人的时间。谢谢大家。 - joshua
我也认为是代码在另一端监听。如果那段代码执行了类似于“ReadToEnd”的操作,它会一直挂起,直到发送方关闭其输出流。 - Jim Mischel
显示剩余2条评论
4个回答

1

你可能正在使用缓冲流,请尝试调用.Flush方法,该方法在调用close时也会自动调用。


嗯,看起来我这里确实有一个NetworkStream问题,就像你说的那样。Flush不起作用,但close/dispose可以。现在我需要弄清楚为什么。 - joshua

0

如果您在写入后阻止主线程执行,这可能会阻止消息泵运行并且无法发送您的数据。因此,如果释放主线程(关闭数据流),它可能看起来像是修复了问题,但实际上是释放主线程允许数据被处理和写入。

如果您希望阻塞以等待数据被写入,请确保使用BeginWrite,如下所示:

void clientThread()
{
   writeStream.BeginWrite(buffer, 0, buffer.Length, myCallback, networkStream);
   resetEvent.WaitOne(timeout);
}
void myCallback(IAsyncResult ar)
{
   NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState;
   myNetworkStream.EndWrite(ar);
   resetEvent.Set();
}

@joshua - 没问题,如果您发布一些代码,我们或许能够提供更多帮助。 - SwDevMan81

0

不会,它们可能会在200毫秒延迟后发送出去。

一定有其他问题。


我使用了NoDelay选项,但没有任何改变。 - joshua
1
“不应该经常使用NoDelay。因此,我的结论是肯定有其他问题。” - Stephen Cleary

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接