Я работаю на небольшом сетевом сервере и делаю это из последней версии MonoDevelop.
У меня есть метод 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), код РАБОТАЕТ! Я ничего не делаю с tcpClient, я просто передаю это непосредственно в функцию выше, с объектом Player, который был инициализирован с помощью 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();