TcpClient C#等待新数据可用

问题描述

我正在尝试使用tcpclient从tcp服务器检索数据,发送请求和接收响应,除了一件事之外,它都可以正常工作。 当我尝试多次使用 networkstream.readasync 然后 networkstream.writeasync 时,readasync函数读取的是先前writeasync的上一个响应而不是最后一个。我必须设置超时时间才能阅读。除了设置超时之外,还有什么方法可以等待直到新数据可用?

伪代码示例:

connectasync(host,port);
//reads a hello message from the server
networkstram.readasync();
//sending a request to the server
networkstram.writeasync();
//reads again the hello message from the previous read 
//not the response from the previously sended writeasync 
networkstram.readasync()

伪代码解决方案:

connectasync(host,port);
//reads a hello message from the server
networkstram.readasync();
//sending a request to the server
networkstram.writeasync();
//wait for 1 second
wait(1000)
//reads correctly
networkstram.readasync()

如果您有更好的方法等待新的可用数据,而不是使用固定的超时时间,请告诉我。 谢谢。

更新 注意:我什至尝试了同步版本的读写操作。 我只是使用异步来阻止用户界面。

    public async Task<string> sendQuery()
    {

        
        try
        {
            client.Connect(ConfigParameters.ip,ConfigParameters.port);
            if (client.Connected == true)
            {
                Console.WriteLine("Connected");
                var networkStream = client.GetStream();
                


                // Receive data from server
                //Receiving HELLO message from the server
                byte[] buffer = new byte[1024];
                await networkStream.ReadAsync(buffer,buffer.Length);
                var serverResponse = Encoding.ASCII.GetString(buffer);
                Console.WriteLine("Server: " + serverResponse);
                Array.Clear(buffer,buffer.Lenght);
                Array.Resize(ref buffer,1024);

                // Send data to server
                // send query to the server
                
                string data = QueryStore.queryStart+QueryStore.query1.getLRC() + QueryStore.queryEnd;
                buffer = System.Text.Encoding.ASCII.GetBytes(data);
                await networkStream.WriteAsync(buffer,buffer.Length);
                 Array.Clear(buffer,1024);
                
                // Receive data from server
                // receive still HELLO message
                buffer = new byte[1024];
                await networkStream.ReadAsync(buffer,buffer.Length);
                serverResponse = Encoding.ASCII.GetString(buffer);
                Console.WriteLine("Server: " + serverResponse);
                
                networkStream.Close();
                client.Close();
                return "ok";
            }

        }
        catch(SocketException)
        {
           client.Close();
           return "error";
        }
        finally 
        {
            client.Close();
            return "";
        }
        
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...