TcpClient 发送/关闭问题

Posted

技术标签:

【中文标题】TcpClient 发送/关闭问题【英文标题】:TcpClient send/close problem 【发布时间】:2011-06-21 08:47:03 【问题描述】:

我是否需要关闭连接才能真正发送消息?因为无论我使用发送命令还是使用网络流,我的消息在我关闭连接之前都不会得到处理。这是它应该的方式还是我错过了什么?

好的,这是代码。

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);

【问题讨论】:

你在用什么类? + 粘贴代码示例。 你所有的代码都属于我们。 ToByteArray 长什么样子? 只是一个与您的问题无关但根据 MSDN 的旁注:“在发送和接收数据时,您必须关闭 NetworkStream。关闭 TcpClient 不会释放 NetworkStream。” msdn.microsoft.com/en-us/library/… 谢谢克里斯,我会记住这一点的。 【参考方案1】:

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

【讨论】:

嗯,就像你说的那样,我在这里遇到了 NetworkStream 问题。 Flush 不起作用,但 close/dispose 可以。现在我需要弄清楚原因。【参考方案2】:

没有;它们会被发送出去,可能会延迟 200 毫秒。

肯定还有什么问题。

【讨论】:

我使用了 NoDelay 选项。没有什么不同。 NoDelay 几乎不应该被使用。因此,我的结论是肯定还有其他问题。【参考方案3】:

如果您在Write 之后阻止主线程执行,这可能会阻止消息泵运行而不发送您的数据。所以如果你释放主线程(关闭你的数据流),看起来好像是在修复它,但实际上是释放主线程,允许数据被处理和写入。

如果您确实希望阻止要写入的数据,请确保您像这样使用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 - 没问题,如果您发布一些代码,我们可能会提供更多帮助。【参考方案4】:

看起来Nagle's algorithm 正在行动。尝试使用SetSocketOption 方法启用NoDelay 套接字选项。但请注意,禁用 Nagle 算法会降低吞吐量。

【讨论】:

以上是关于TcpClient 发送/关闭问题的主要内容,如果未能解决你的问题,请参考以下文章

TcpClient 是单个连接使用吗?如何发送第二条消息?

如何设置 TcpClient 的超时时间?

C# Tcp协议收发数据(TCPClient发,Socket收)

如何检查 TcpClient 连接是不是关闭?

使用 TcpClient 通过网络发送和接收数据

关闭 TcpListener 和 TcpClient 连接的正确顺序(哪一侧应该是主动关闭)