【发布时间】:2014-10-07 17:53:02
【问题描述】:
在我的程序中的某些时刻,我有时会几乎同时从不同的线程向服务器进行写入。我注意到,当两者都几乎立即发送时,尽管使用了 TCP,但其中一个永远不会到达服务器,应该确保接收到数据包。
为了测试这一点,我只是一个接一个地发送了 1000 个数据包,没有延迟:
NetworkStream stream = server.GetStream();
int i = 0;
while (i < 1000)
{
byte[] data = Encoding.Unicode.GetBytes(i.ToString() + "$");
stream.Write(data, 0, data.Length);
i++;
}
并接收:
bool LostConnection = false;
NetworkStream stream = client.GetStream()
while (ClientSocket.Connected && !LostConnection && !AppIsClosing)
{
try
{
byte[] ReceivedBytes = new byte[4096];
if (stream.Read(ReceivedBytes, 0, ReceivedBytes.Length) == 0)
{ LostConnection = true; break; }
string DataFromClient = Encoding.Unicode.GetString(ReceivedBytes);
if (DataFromClient.Contains("$"))
{
DataFromClient = DataFromClient.Substring(0, DataFromClient.IndexOf("$"));
Console.WriteLine(" >> " + DataFromClient);
}
}
catch { }
}
输出:
>> 0
>> 1
>> 20
>> 76
>> 108
>> 136
>> 163
>> 197
>> 220
>> 241
>> 276
>> 302
>> 330
>> 372
>> 373
>> 469
>> 507
>> 530
>> 560
>> 590
>> 628
>> 651
>> 683
>> 722
>> 747
>> 772
>> 803
>> 826
>> 861
>> 889
>> 913
>> 950
>> 980
什么可能导致这种现象?
附:我也试过:
var result = stream.WriteAsync(data, 0, data.Length);
result.Wait();
运气不好……
更新:
好吧,我很愚蠢。该流包含所有其他堆积的文本,我只需使用Substring(0, IndexOf("$")) 将其删除
所以现在我只需将 $ 替换为新行,但随后又遇到了另一个问题。在 800-900 左右的某个地方,它又从 500 开始计数,然后达到 999。这可能是什么原因?
【问题讨论】:
-
您不使用
stream.Read返回的内容。Read可能一次返回多个数据包或一半数据包。 -
也不要把catch留空,也许你会遇到异常!
-
那我用什么,好心的先生?
-
另外,出于调试目的,将其放在 if(contain($)): Console.WriteLine(" Raw Data >> " + DataFromClient);
-
@PkKingX11,而不是
$使用\r\n作为分隔符,那么你可以使用StreamReader类的ReadLine方法。这样生活会更轻松。