【问题标题】:How can I send data with a TcpListener, and wait for the response?如何使用 TcpListener 发送数据并等待响应?
【发布时间】:2010-12-09 14:00:03
【问题描述】:

我有以下代码:

using (TcpClient client = new TcpClient())
{
   client.Connect(host, port);

   using (SslStream stream = new SslStream(client.GetStream(), true))
   {
      stream.AuthenticateAsClient(host);

      stream.Write(System.Text.Encoding.ASCII.GetBytes(dataToSend));

      int byteRead = 0;
      byte[] buffer = new byte[1000];

      do
      {
         byteRead = stream.Read(buffer, 0, 1000);
         reponse += System.Text.Encoding.ASCII.GetString(buffer, 0, byteRead);
      }
      while (byteRead > 0);
   }
}

我向服务器发送一个字符串,然后等待响应。

这是正确的做法吗?

如果服务器需要一些时间来处理我发送的内容,它仍然可以工作还是 stream.Read 返回 0 并退出循环?或者如果响应中的一些数据包丢失并且需要重新发送,它仍然可以工作吗?

【问题讨论】:

  • 您不应该担心通过 TCP 连接丢失数据,这取决于网络代码通过再次询问丢失的数据包来确保不会发生这种情况。它对您的应用程序是透明的。
  • 我知道我不能丢失数据,但我害怕数据延迟。我不知道 Read 会阻塞。 MSDN 文档不是很清楚。它说:“此方法将数据读入缓冲区参数并返回成功读取的字节数。如果没有数据可供读取,则Read方法返回0。”所以我想如果服务器还没有处理我的字符串,我的 Read 将返回 0,我将永远不会收到任何东西。由于Read是阻塞方法,所以没关系。

标签: c# tcplistener


【解决方案1】:

您的代码的整体结构看起来不错。

byteRead = stream.Read(buffer, 0, 1000); 将阻塞,直到从服务器检索到所有响应数据。如果远程服务器关闭连接(超时等),将返回 0。

见备注found here

该框架将正确处理网络操作期间丢失的数据包 - 不用担心。

【讨论】:

    【解决方案2】:
    public string Method()
    {
      m_Client = new TcpClient();
      m_Client.Connect(m_Server, m_Port);
      m_Stream = m_Client.GetStream();
      m_Writer = new StreamWriter(m_Stream);
      m_Reader = new StreamReader(m_Stream);
      m_Writer.WriteLine(request);
      m_Writer.Flush();
    
      return m_Reader.ReadToEnd();
    }
    

    【讨论】:

    • 如果可以的话,我会给你一个-1。不关闭 TcpClient 和使用 m_Client.GetStream() 检索的 NetworkStream 只是在乞求内存泄漏。原始海报已使用using 语句正确编码。
    • 这只是一个例子。如果你看到变量名,我应该知道它们是类成员。要在这里发帖,我刚刚加入了 2 个或更多方法。在制作中我没有使用上面的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2022-10-12
    • 2015-12-05
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多