【发布时间】:2012-02-16 11:10:46
【问题描述】:
我正在开发一个小型网络服务器,并且正在使用最新版本的 MonoDevelop。
我有一个方法,PlayerReadLoop,它传递了一个普通的 Player 对象,也传递了一个 tcpClient 对象。该方法尚未完成,并且不依赖于它所传递的 Player 对象,因此无需提供任何有关 player 的信息。 TcpClient 肯定已正确初始化,因为我已经通过该 tcpClient 成功发送消息。
方法如下:
private void playerReadLoop(Player p, TcpClient c)
{
byte[] message = new byte[4096];
int bytesRead;
NetworkStream clientStream = c.GetStream();
while (true)
{
bytesRead = 0;
try
{
bytesRead = clientStream.Read(message, 0, 4096);
}
catch
{
Console.WriteLine("ERROR");
break;
}
if (bytesRead == 0)
{
Console.WriteLine("Disconnected");
break;
}
ASCIIEncoding encoder = new ASCIIEncoding();
Console.WriteLine(encoder.GetString(message, 0, bytesRead));
}
}
由于某种原因,上面的代码不起作用!你看,
当我包围两条线时:
SCIIEncoding encoder = new ASCIIEncoding();
Console.WriteLine(encoder.GetString(message, 0, bytesRead));
无论我的客户端是否发送消息,clientStream.Read 都会通过并返回零字节,表示断开连接。我的客户根本没有发送任何东西,当然也没有断开连接。
当两行没有标注时,clientStream.read 永远不会通过。我的客户是否发送消息。
现在,如果这还不够奇怪,在我的 tcpClient 初始化之后直接使用上面的代码(使用与初始化 tcpClient 相同的方法),代码可以工作!我没有对 tcpClient 做任何事情,我只是将它直接传递给上面的函数,并带有一个使用 tcpClient 初始化的 Player 对象。 player 对象不对 tcpClient 做任何事情,它只是将它存储在它的一个变量中。我不明白将这段代码放在它自己的方法中的简单行为是如何导致行为上如此令人讨厌的差异的!
客户端代码很简单:
TcpClient client = new TcpClient();
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 21255);
client.Connect(serverEndPoint);
NetworkStream clientStream = client.GetStream();
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] buffer = encoder.GetBytes("Hello Server!");
clientStream.Write(buffer, 0 , buffer.Length);
clientStream.Flush();
【问题讨论】:
-
“当我将两条线包围起来时:[...] 带有符号”是什么意思?
-
第 1 行;第2行;变成 /*line1; line2;*/
-
“我的客户端根本没有发送任何东西,当然也没有断开连接。”...但是服务器呢?您如何确定该连接的服务器端没有断开您的连接。在网络代码故障排除期间运行 Wireshark 是必须的。
标签: c# networking