2015-08-26 3 views
2

Просто пытаются использовать NetworkStream, и это простой код, который я написал:C# NetworkStream читает ничего

стороне клиента:

 TcpClient c = new TcpClient(); 
     c.Connect("10.0.0.4", 10); 
     NetworkStream ns = c.GetStream(); 
     byte[] buffer = System.Text.Encoding.UTF8.GetBytes("first"); 
     byte[] buffer2 = System.Text.Encoding.UTF8.GetBytes("second"); 
     MemoryStream stream = new MemoryStream(); 
     stream.Write(buffer, 0, buffer.Length); 
     stream.Write(buffer2, 0, buffer2.Length); 
     stream.CopyTo(ns); 

Это на стороне сервера:

 TcpListener tl = new TcpListener(IPAddress.Any, 10); 
     tl.Start(); 
     TcpClient c = tl.AcceptTcpClient(); 
     NetworkStream ns = new NetworkStream(c.Client); 
     byte[] buff = new byte[5]; 
     ns.Read(buff,0,buff.Length); 
     string result = System.Text.Encoding.UTF8.GetString(buff); 
     MessageBox.Show(result); 

только когда я закрываю все приложение, выполняется строка MessageBox, и я всегда получаю пустое сообщение! что означает result не содержит ничего ... Любая помощь?

+0

'stream.Flush' ?? – Eser

+0

@Eser nope. Он не решает ни одну из двух проблем. – Slashy

ответ

2

На клиенте stream расположен в самом конце потока. Поэтому CopyTo нечего копировать.

Используйте stream.Position = 0; перед копированием.

Кроме того, вы, кажется, не знаете о том, что сокет читает (на самом деле любой прочитанный поток) может возвращать меньше байтов, чем было запрошено (по крайней мере, одно). Ваш код чтения должен учитывать это. TCP не сохраняет границы сообщений.

+0

Да, я знаю, что .. спасибо. это был просто пример известного объема данных !. это сработало! – Slashy

+0

Могу ли я спросить, сохраняет ли udp границы? – Slashy

+0

Он делает это, но он отбрасывает сообщения. Если вы хотите отправлять сообщения, используйте стек более высокого уровня, такой как http, wcf или length prefixed protobuf. – usr

Смежные вопросы