2010-03-24 3 views
2

эй, я пишу в программе Server-Client , но когда мой клиент что-то посылает, он никогда не доходит до моего сервера! Что происходит здесь несетевой поток всегда пуст!

public void Send(string s) 
    { 
     char[] chars = s.ToCharArray(); 
     byte[] bytes = chars.CharToByte(); 
     nstream.Write(bytes, 0, bytes.Length); 
     nstream.Flush(); 
    } 

и прием в фоновом потоке, как этот

void CheckIncoming(object dd) 
    { 
     RecievedDelegate d = (RecievedDelegate)dd; 
     try 
     { 

      while (true) 
      { 
       List<byte> bytelist = new List<byte>(); 
       System.Threading.Thread.Sleep(1000); 
       int ssss; 
       ssss = nstream.ReadByte(); 
       if (ssss > 1) 
       { 
        System.Diagnostics.Debugger.Break(); 
       } 
       if (bytelist.Count != 0) 
       { 
        d.Invoke(bytelist.ToArray()); 
       } 
      } 
     } 
     catch (Exception exp) 
     { 
      MSGBOX("ERROR:\n" + exp.Message); 
     } 
    } 

ГФСС ИНТ никогда> 1 ???:

Я посылаю, как это

+0

Я должен был предположить, что происходит некоторая скрытая буферизация. Если вы вызываете 'nstream.Close()' его отправляет *, то *? Кроме того, вы должны проверить '> = 0' - как 0 и 1 являются действительными байтами. 'ReadByte' возвращает отрицательный результат, если данные отсутствуют. –

ответ

2

NetworkStream.Flush() на самом деле не имеет никакого эффекта:.

смывного метод реализует поток .. :: Flush метод; однако, поскольку NetworkStream не буферизуется, он не влияет на сетевые потоки [sic]. Вызов метода Flush не дает исключения

Сколько данных отправляется?
Если вы не отправляете достаточно данных, оно может оставаться на уровне сети, пока вы не закроете поток или не напишите больше данных.

См. Свойство TcpClient.NoDelay, чтобы отключить его, если вы собираетесь отправлять небольшие фрагменты данных и требуют небольшой задержки.

0

Вы должны изменить проверку возвращаемого значения на if (ssss >= 0).

ReadByte возвращает значение больше или равно 0, если ему удастся прочитать байт (source).

Чтобы подробно остановиться на комментарии Марка: Как создается nstream? Возможно, существует базовый класс, который не скрывается.

+0

Или даже '> = 0' (согласно моему комментарию) –

+0

Вупы, конечно. Не используется для off-by-2 :) – mafu

0

ну, я создаю TcpClient и использую GetStream(); чтобы получить NetworkStream

+0

Я вижу, что вы новичок на этом сайте. У Stackoverflow нет такой структуры обсуждения, как большинство форумов. Вместо того, чтобы отправлять ответ, попробуйте отредактировать вопрос или добавьте комментарий непосредственно к ответу другого пользователя. Сначала это немного сбивает с толку, я сам сделал ту же ошибку;) – mafu

+0

О вашем фактическом ответе: я вижу, это должно быть хорошо. Тогда нет подсказки. :( – mafu

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