tcpclient监听实现

时间:2009-11-05 22:54:35

标签: c# tcpclient

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

由于

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

检查方法EstablishConnection()IncomingDataSyncWorker()(同步)或IncomingPacketHandler()(异步)以获取您要执行的操作的示例。所有这些方法都是networkComms.net开源网络通信库的一部分。

答案 2 :(得分:0)

您使用的是什么版本的.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()将在单独的线程中等待,直到服务器发送一些数据。然后其余的代码将执行。