首页 > 解决方案 > C# TcpClient 错误地读取了前一个 Write 的响应

问题描述

作为客户端,我有一个要发送到服务器的消息队列。每个都打开一个新的 TcpClient,Write 和 Read。

如果服务器有延迟,并且客户端超时,我关闭 TcpClient 并移动到下一条消息。

但是,在写和读下一篇的时候,我误读了前面的回复。

这是说明问题的代码:

        using (TcpClient client1 = new TcpClient(ip, port))
        using (NetworkStream stream1 = client1.GetStream())
        {
            byte[] dataToSend = Encoding.ASCII.GetBytes(message1);
            await stream1.WriteAsync(dataToSend, 0, dataToSend.Length);
            await stream1.FlushAsync();
            // The server takes a while to respond. Simulate a timeout in client...
        }

        using (TcpClient client2 = new TcpClient(ip, port))
        using (NetworkStream stream2 = client2.GetStream())
        {
            byte[] dataToSend = Encoding.ASCII.GetBytes(message2);
            await stream2.WriteAsync(dataToSend, 0, dataToSend.Length);
            await stream2.FlushAsync();

            byte[] dataToRead = new byte[client2.ReceiveBufferSize];
            int bytesRead = await stream2.ReadAsync(dataToRead, 0, client2.ReceiveBufferSize);
            string messageReceived = Encoding.ASCII.GetString(dataToRead, 0, bytesRead);
        }

'messageReceived' 得到第一个写入而不是第二个的响应。

我尝试设置客户端的 SendTimeout/ReceiveTimeout,但没有帮助。

是否有一种优雅的方式来忽略/避免先前写入的响应?

标签: c#tcpclientnetworkstream

解决方案


这是服务器的问题。每个连接都是独立的。即使客户端和服务器相同,新连接也不会看到旧连接的数据。

如果一个连接得到一个针对不同连接的响应,那么这是服务器中的一个错误。听起来服务器可能正在向“当前连接的任何客户端”发送响应,这几乎总是不正确的行为。相反,服务器应该只向发送请求的同一连接发送响应。


推荐阅读