我正在一个小型的网络服务器上工作,而我正在从最新版本的MonoDevelop开始。c#网络奇怪
我有一个方法,PlayerReadLoop,它传递了一个普通的Player对象,并且还传递了一个tcpClient对象。这个方法还没有完成,并且不依赖于它传递的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初始化相同的方法中)上面的代码,代码WORKS!我没有对tcpClient做任何事情,我只是直接将它传递给上面的函数,并使用使用tcpClient初始化的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();
你是什么意思的“当我围绕两条线:[...]与符号”? – arx
line1; 2号线;成为/ * line1; line2; */ –
“我的客户根本没有发送任何内容,当然也没有断开连接。”但是服务器呢?你怎么能确定该连接的服务器端没有丢失你的连接。在网络代码故障排除期间运行Wireshark是必须的。 – tcarvin