2013-08-22 3 views
1

Я ломаю голову над ошибкой в ​​этой системе, которую я строю. В принципе, я использую сокеты для связи между двумя приложениями C#. Вернее, сервер сценариев Unity C# и клиентское приложение C#.Socket получает правильные байты, байт переводится в пустую строку

С ручными испытаниями система работает отлично, никаких аномалий вообще. Чтобы проверить работоспособность и многопользовательскую функциональность, я написал класс тестера, который запускает несколько потоков (клиентов) и имеет количество сообщений об угрозе X на сервере. Вот где моя проблема возникает ... Иногда.

Когда Socket отправляет или получает, он возвращает целочисленный контейнер количество байтов, которое было отправлено/получено. Когда проблема возникает, я вижу, что на сервер поступило правильное количество байтов. Тем не менее, после ввода байтов в строку, я неожиданно покинул пустую строку, вместо сообщения, которое я обычно вижу здесь.

Я в недоумении от того, что вызывает эту проблему. Я использую Encoding.Default.GetString() для перевода байтов в строку.

Любая помощь приветствуется! Дэвид

public void ReceiveFromClient (Socket handlerSocket) 
{ 
    serverBuffer = new byte[iBufferSize]; //iBufferSize = 8192; 

    int i = handlerSocket.Receive (serverBuffer); 
    Debug.Log ("Bytes received: " + i); 

    string message = Encoding.UTF8.GetString (serverBuffer, 0, i); 
    Debug.Log ("Message received: " + message); 

    //Do stuff with the message 

}

bool SendMessageToUnity(string input) 
    {//returns a bool saying whether the message was sent or not 
     if (clientSocket != null) 
     { 
      if (clientSocket.Connected) 
      { 
       byte[] bytes = Encoding.UTF8.GetBytes(input+"|"); 
       txtOutput.BeginInvoke(new Action(() => txtOutput.AppendText("Sending message: " + Encoding.UTF8.GetString(bytes) + Environment.NewLine))); 

       int i = clientSocket.Send(bytes); 
       txtOutput.BeginInvoke(new Action(() => txtOutput.AppendText("Sending "+i+" bytes. "+ Environment.NewLine))); 
       return true; 
      }     
     } 
     return false; 
    } 
+1

Вы должны использовать 'Encoding.UTF8', а не' Encoding.Default'. 'Encoding.Default' может быть разным между разными компьютерами. – xanatos

+2

Опубликуйте свой код .. – I4V

ответ

0

Ищут для нулевого значения ('\ 0') в массиве байтов до преобразования его в строку.

private string GetString(byte[] data) 
{ 
    data = data.Where(b => b != 0).ToArray(); 
    return Encoding.UTF8.GetString(data); 
} 
+0

Я взглянул, и это, похоже, не проблема, нет нулевого значения в байтах, которые я просматриваю прямо сейчас, но это переводится в пустую строку. Однако я заметил что-то еще. Когда я получаю пустую строку, количество байтов, которое у меня превышает, превышает количество байтов, которые посылает функция Receive. У меня есть массив с позициями 0 - 27, но он говорит, что он получил только 26 байт. Я обновляю массив байтов перед каждым Получением. – David

+0

Пожалуйста, разместите свой код. если вы вызываете перегрузку Получите перегрузку класса Socket со значением параметра offset, убедитесь, что вы передаете нуль для смещения. – Farzan

+0

Я загрузил код и изменил кодировку на UTF8 – David

0

Если вы правильно задаете массив байтов, чем проблема в кодировке. Проверьте отправку кодировки, как правило, UTF8, но вы должны проверить это.

, а затем var inputStr = Encoding.UTF8.GetString (InputByteArray);

^^

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