首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tcpclient监听实现

tcpclient监听实现
EN

Stack Overflow用户
提问于 2009-11-06 06:54:35
回答 3查看 3.3K关注 0票数 0

我正在尝试实现一个tcp客户端侦听功能。这意味着,在与服务器建立连接后,此tcp客户端只是停留在那里,等待新数据的到达。这是我的代码,但当它运行时,它会抱怨无法从网络流中读取任何内容。但是服务器还没有开始发送数据。我猜是因为tcp客户端超时引起的。

这是正确的做法吗?

代码语言:javascript
复制
   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);
            }
        }
    }

谢谢

EN

回答 3

Stack Overflow用户

发布于 2009-11-06 08:38:44

简而言之,答案是肯定的,它会做你想做的事情,但它并不理想。我首先建议将stream = main_client.GetStream();移出while循环,因为您只是一遍又一遍地得到相同的流。此外,如果您希望在很长一段时间内获得断断续续的数据,那么使用NetworkStream.Read也不是执行连续读取的最佳方式,因为它只为一个任务占用了一个线程;最好使用BeginRead并传入一个回调,该回调将立即返回,但当数据可用时(通过回调)会发出警报。

票数 1
EN

Stack Overflow用户

发布于 2011-12-26 17:46:04

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

票数 0
EN

Stack Overflow用户

发布于 2012-12-06 16:44:20

您使用的是什么版本的.Net?

如果您使用的是.Net 4.0或4.5,则可以使用ReadAsync()而不是Read()

请考虑以下内容:

代码语言:javascript
复制
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()将在一个单独的线程中等待,直到服务器发送一些数据。然后,您的其余代码将会执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1684232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档