c# - 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,但没有帮助。
是否有一种优雅的方式来忽略/避免先前写入的响应?
解决方案
这是服务器的问题。每个连接都是独立的。即使客户端和服务器相同,新连接也不会看到旧连接的数据。
如果一个新连接得到一个针对不同连接的响应,那么这是服务器中的一个错误。听起来服务器可能正在向“当前连接的任何客户端”发送响应,这几乎总是不正确的行为。相反,服务器应该只向发送请求的同一连接发送响应。
推荐阅读
- resolution - 如何提高 `ax.stock_img()` 的细节/分辨率级别?
- typescript - 消除永不使联合成为可能
- sql - 打印列的两个表中的共同值
- google-analytics - Google Search Console API - 从 URL 获取 HTML?
- mongodb - 两个孩子具有相同的密钥 mongodb _id
- time - 试图找出在特定时间范围内石油市场触及特定价格的概率
- java - 从给定字符串转换为 long 并在解码时返回相同的字符串
- sql - powershell不导出
- oracle - Oracle 与 Symfony 5 原则的连接
- c# - c#在tablelayout面板中使用不同的子控件会影响应用程序的速度吗