2015-10-20 4 views
0

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

static void ServerTalk(TcpClient tcpClient,NetworkStream networkStream, StreamWriter streamWriter, StreamReader streamReader) 
    { 
     //Messaging methods: 
     Console.WriteLine("Client: "); 
     string message = Console.ReadLine(); 
     streamWriter.WriteLine(message); 
     streamWriter.Flush(); 
     //Response methode: 
     byte[] data = new byte[tcpClient.ReceiveBufferSize]; 
     int ret = networkStream.Read(data, 0, data.Length); 
     string respond = Encoding.ASCII.GetString(data).TrimEnd(); 
     Console.WriteLine("Server: "); 
     Console.WriteLine(respond); 
     ServerTalk(tcpClient, networkStream, streamWriter, streamReader); 
    } 
+0

Я подозреваю, что вы отправляете нули в конце данных, которые отображаются как черные. Я прекратил бы данные у отправителя с возвратом ('\ n'), а затем в конце приема только напечатайте символ до возврата. – jdweng

+0

как насчет рекурсивного вызова в конце метода? Как это должно работать? –

+0

@HughJones я просто положил его так, чтобы все начиналось сначала, так как все, что приложение собирается делать, это блок кода, остальная часть кода работала и использовалась один раз, Думаю, мне нужно это приложение, чтобы сделать что-нибудь еще за пределами этого момента. – soorena12

ответ

0

вам нужно обрабатывать только RET байт, вы переводите все байты в массиве.

копировать в новый массив, который долго «ret», а затем декодировать.

var retarr = new byte[ret]; 
Array.Copy(data,retarr,ret); 
string respond = Encoding.ASCII.GetString(retarr); 

Важно отметить, что этот способ связи tcp не будет работать. Вы предполагаете, что когда вы отправляете x байтов в одном блоке, вы получите x байтов в одном блоке, это не так, вы можете отправить 1 100-байтовое сообщение и принять 100 1 байт-сообщений.

Это означает, что вы выполняете большую задачу более сложный. Вам нужно разработать способ отправки самостоятельного описания данных - чтобы вы знали, что его полностью получили. классически вы отправляете длину, за которой следуют данные. Затем вы продолжаете цикл в коде получения до тех пор, пока не получите столько байтов

+0

Большое спасибо за ваше обновление, и ваше право, что я делаю, - это комплекс, но мы все должны начать с чего-то. – soorena12

+0

, если вы снова застряли, отправьте еще один вопрос. Научитесь использовать отладчик vs – pm100

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