2013-09-12 2 views
0

Я разрабатываю приложение Windows (связь между сервером и клиентом), на котором сервер непрерывно отправляет строковое сообщение клиенту и клиенту, считывая это сообщение через сетевой поток. После прочтения сообщения от клиента сетевого потока очистите сетевой поток, но старое сообщение все еще остается в сетевом потоке. Я думаю, что это происходит из-за непрерывной записи сообщения в сетевом потоке на стороне сервера.NetworkStream.Flush() в C# Программирование сокетов

КОД Клиент:

clientSocket.Connect("192.XXX.X.XX", 8888); 
label1.Text = "Client Socket Program - Server Connected ..."; 
NetworkStream serverStream = clientSocket.GetStream(); 
string returndata = ""; 
while ((true)) 
{ 
    byte[] inStream = new byte[10025]; 
    serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize); 
    returndata = System.Text.Encoding.ASCII.GetString(inStream); 
    serverStream.Flush(); 
} 

Server Side:

TcpListener serverSocket = new TcpListener(8888); 
TcpClient clientSocket = default(TcpClient); 
NetworkStream networkStream = null; 
serverSocket.Start(); 
clientSocket = serverSocket.AcceptTcpClient(); 
networkStream = clientSocket.GetStream(); 
Byte[] sendBytes = Encoding.ASCII.GetBytes(task); 
networkStream.Write(sendBytes, 0, sendBytes.Length); 
networkStream.Flush(); 

Пожалуйста, скажите мне, как я могу решить эту проблему?

+1

AFAIR вы не можете очистить TCP от окон. Вы можете только отключить алгоритм nagle, но это полезно только для уменьшения задержки в некоторых сценариях, это не влияет на правильность. Другая проблема заключается в том, что ваш «Flush» на стороне клиента бессмыслен. 'Flush' означает« записывать кэшированные данные на диск (или какой-либо другой более низкий уровень) ». Это не имеет никакого смысла, когда вы только * читаете *, а не * пишете *. – CodesInChaos

+1

Ваша проблема с тем, что вы ожидаете, что 'Write' и 'Read' будут работать с сообщениями '. TCP - это просто длинный поток байтов. Он может комбинировать несколько 'Write' в один 'Read' или разделять' Write' на несколько чтений. Если вы хотите разделить поток на сообщения, вам нужно ввести разделители самостоятельно. См. [Потеря данных TCP IP C#] (http://stackoverflow.com/questions/5528234/data-loss-tcp-ip-c-sharp/5528284#5528284) для соответствующего вопроса. – CodesInChaos

+0

@CodesInChaos: Я новичок в программировании сокетов, я просто хочу очистить сетевой поток, чтобы от клиента я мог прочитать последнее сообщение, отправленное сервером. – BhushanK

ответ

1

Как уже упоминалось в Jaroen, одним из способов может быть то, что на клиенте вы отправляете sendbyte[0] = task.length;, чтобы на сервере вы знали, чего ожидать. Затем вы можете считывать только байты из последнего сообщения, и не нужно заботиться о том, что еще потом в потоке. Может также помочь очистить байтовый массив «instream»: Array.Clear(instream, startIndex, endIndex);

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