【发布时间】:2012-11-05 23:11:39
【问题描述】:
我在将一小段数据(日期)发送到同一台计算机上运行的另一个 TcpClient 时遇到问题。
在下面的代码中,您将看到它在关闭 NetworkStream 之前处于休眠状态。如果我删除了Sleep,它会导致数据在另一端没有出现的间歇性问题。
我在这里做错了吗?
using (TcpClient client = new TcpClient())
{
client.Connect(new IPEndPoint(IPAddress.Loopback, _tcpServerPort));
NetworkStream clientStream = client.GetStream();
byte[] buffer = new ASCIIEncoding().GetBytes(theDateObject.ToString("yyyy-MM-dd HH:mm:ss"));
clientStream.Write(buffer, 0, buffer.Length);
clientStream.Flush();
System.Threading.Thread.Sleep(1000); // Remove this line and the data may not arrive at the other end
clientStream.Close();
}
其他一些信息:
- 在某些计算机上,您可以删除
Sleep而不会造成问题(可能是速度较慢的计算机?) - 我尝试使用
Close(int timeout)关闭 NetworkStream(而不是休眠),但这没有帮助。 - 1000 毫秒的值是任意的 - 我怀疑其他值也可以。问题是:为什么首先需要它?
【问题讨论】:
-
只是为了检查 - 您是否期望所有数据都将通过对另一端的
Read的一次调用到达?因为这不是 TCP 套接字的保证。 -
是的,我想我是。但是我相信,如果在第一次读取时没有收到完整的消息(因为它会立即尝试 DateTime.Parse() 消息),另一端的代码会出错。我没有看到另一端抛出任何异常。
-
@shambulator - 不,即使您正在使用流,它也是相关的。如果您使用它,而不是更高级别的抽象(例如 WCF、Web 服务等),那么您有责任自己重建消息。请注意
NetworkStream.Read的文档:“Read 操作读取尽可能多的数据,最多为 size 参数指定的字节数” -
@Damien_The_Unbeliever 抱歉,我误读了您关于写入所有可用数据的第一条评论,这就是为什么我匆忙删除了我的:P
-
我认为这不太可能是问题是否正确?鉴于我尝试 DateTime.Parse() 从我的第一个(也是唯一一个)NetworkStream.Read() 收到的内容?