TcpClient发送/关闭问题

时间:2011-02-04 13:13:39

标签: c# sockets tcp send

我是否需要关闭连接以实际发送消息?因为我是使用send命令还是使用网络流,所以在我关闭连接之前,我的消息不会得到处理。这是它应该是的方式还是我错过了什么?

好的,这是代码。

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

没有;他们会在200分钟的延迟后被送出去。

一定有其他错误。

答案 2 :(得分:0)

如果在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();
}

答案 3 :(得分:0)

似乎Nagle's algorithm正在行动中。尝试使用NoDelay方法启用SetSocketOption套接字选项。但要小心,禁用Nagle的算法会降低吞吐量。