我正在一個小型的網絡服務器上工作,而我正在從最新版本的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