0

我正在尝试实现一个 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);
            }
        }
    }

谢谢

4

3 回答 3

1

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

于 2009-11-06T00:38:44.200 回答
0

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

于 2011-12-26T09:46:03.743 回答
0

您使用的是什么版本的 .Net?
如果您使用的是 .Net 4.0 或 4.5,那么您可以使用 .NetReadAsync()代替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()将在一个单独的线程中等待,直到服务器发送一些数据。然后您的其余代码将执行。

于 2012-12-06T08:44:20.233 回答