2015-08-09 5 views
0

Я использую Unity и .NET для создания отношений клиент-сервер TCP.Null Reference Исключение, когда объект четко определен

У меня на самом деле есть все, где я могу отправлять сообщения туда и обратно, но теперь я нахожусь в исключении NullReferenceException, которое заставило меня почесывать голову.

У меня есть функция в моем TCPClientListener в моем коде Unity, который вызывает ReadSocket каждый Update()

public void SetupSocket(){ 
     socket = new TcpClient(host, port); 
     stream = socket.GetStream(); 
     writer = new StreamWriter(stream); 
     reader = new StreamReader(stream); 
     socketReady = true; 

} 

public string ReadSocket(){ 
    if(stream.DataAvailable){ 
     return "New Data! " + reader.ReadLine().Replace("<EOF>", ""); 
    } 
    return ""; 
} 

выше не работает нормально, никаких проблем. Когда сервер отправляет сообщение, я получаю его просто отлично. Но затем я добавляю очень простой оператор if, и теперь я получаю NullReferenceException в отношении читателя.

public string ReadSocket() { 
     if (stream.DataAvailable) { 
      if (reader.ReadLine().Contains("<EOF>")) 
       return "New data! " + reader.ReadLine().Replace("<EOF>", ""); 
     } 
     return ""; 
    } 

Надеюсь, что я слишком долго смотрел на это, чтобы увидеть очевидное. Почему

if (reader.ReadLine().Contains("<EOF>")) 

дайте мне ошибку !? Если я удалю его, ошибки не будет.

+0

Возможный дубликат [Что такое исключение NullReferenceException и как его исправить?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix- это) –

ответ

3

Непосредственная ошибка в том, что вы читаете две строки. Второе чтение возвращает null. Вы могли бы найти это, применяя стандартные методы отладки NRE.

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

Как правило, лучше всего иметь непрерывный цикл чтения и никогда не пул данных. Просто читать. Когда на него принимается новая строка.

+0

О, я вижу. Я добавил строку строки = reader.ReadLine(); Благодарю. Также я ничего не могу найти в Google о NRE. – user3822370

+0

NRE = NullReferenceException – usr

+0

/facepalm, справа. 'Может быть только один байт доступен', поэтому я проверяю user3822370

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