【问题标题】:tcpclient listening implementationtcpclient监听实现
【发布时间】:2012-12-06 16:44:20
【问题描述】:

我正在尝试实现一个 tcp 客户端监听功能。这意味着在与服务器建立连接后,这个 tcp 客户端只是坐在那里等待新数据的到达。 这是我的代码,但是当它运行时,它抱怨无法从 网络流。但是服务器还没有开始发送数据。我想抱怨是因为 tcp 客户端的超时时间。

这是正确的做法吗?

   public void listen(dataHandler processDataFuc)
    {
        NetworkStream stream;

        Byte[] data_buffer = new Byte[MAX_PACKET_SIZE];

        if(!this.Connected)
        {
            this.Connect();
        }

        while (!this.terminate_listening)
        {
            stream = main_client.GetStream();

            while (stream.Read(data_buffer, 0, data_buffer.Length) > 0)
            {
                processDataFuc(data_buffer);
            }
        }
    }

谢谢

【问题讨论】:

    标签: c# tcpclient


    【解决方案1】:

    简短的回答是肯定的,它会做你想做的事,但这并不理想。我首先建议将stream = main_client.GetStream(); 移出while 循环,因为您只是一遍又一遍地获得相同的流。此外,如果您期望在很长一段时间内出现间歇性数据,使用NetworkStream.Read 并不是执行连续读取的最佳方式,因为它只为该一项任务保留了一个线程;最好使用BeginRead 并传入一个回调,它会立即返回,但稍后会在数据可用时提醒您(通过回调)。

    【讨论】:

      【解决方案2】:

      查看EstablishConnection()IncomingDataSyncWorker()(同步)或IncomingPacketHandler()(异步)方法,了解您想要做什么。所有这些方法都是networkComms.net 一个开源网络通信库的一部分。

      【讨论】:

      • 它是开源的,但在 GPL 下。因此,未经开发人员同意,您不能将此库用于闭源软件。
      【解决方案3】:

      您使用的是哪个版本的 .Net?
      如果您使用的是 .Net 4.0 或 4.5,则可以使用 ReadAsync() 而不是 Read()
      考虑一下:

      public async void listen(dataHandler processDataFuc)
      {
          NetworkStream stream;
      
          Byte[] data_buffer = new Byte[MAX_PACKET_SIZE];
      
          if(!this.Connected)
              this.Connect();
      
          stream = main_client.GetStream();
      
          while (!this.terminate_listening)
          {            
              await stream.ReadAsync(data_buffer, 0, data_buffer.Length)
              processDataFuc(data_buffer);
          }
      }  
      

      这样,ReadAsync() 将在一个单独的线程中等待,直到服务器发送一些数据。然后您的其余代码将执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-24
        • 2011-08-21
        • 2015-10-07
        • 2011-02-02
        • 1970-01-01
        • 2011-09-03
        相关资源
        最近更新 更多