2013-09-23 2 views
0

У меня проблема с TCP-клиентом, над которым я работаю. По какой-то причине клиент, кажется, подключается, но он ничего не читает в окне вывода. Вот код:Проблемы с простым TCP-клиентом C# Форма Windows

private void button1_Click(object sender, EventArgs e) 
    { 
     string host = textBox1.Text; 

     int port; 
      port = Convert.ToInt32(textBox2.Text); 
      port = int.Parse(textBox2.Text); 

     string sendText = textBox3.Text; 

     Socket connectSocket = new Socket(AddressFamily.InterNetwork, 
      SocketType.Stream, ProtocolType.Tcp); 

     connectSocket.Connect(host, port); 

     System.IO.StreamReader connectionRead 
      = new System.IO.StreamReader(new NetworkStream(connectSocket)); 

     connectSocket.Send(System.Text.Encoding.UTF8.GetBytes(sendText)); 

     while (connectionRead.Peek() > 0) 
     { 
      this.textBox4.AppendText(connectionRead.ReadLine() + "\r\n"); 
     } 

     connectSocket.Close(); 
    } 

Я сожалею об именах объектов, я сделал это в немного спешке. Это не должно быть слишком сложно понять. Я беру пользовательский ввод из textBox (ов) и помещаю его в переменные.

Я, кажется, застрять на:

while (connectionRead.Peek() > 0) 
{ 
    this.textBox4.AppendText(connectionRead.ReadLine() + "\r\n"); 
} 

Здесь, программа замерзает в течение примерно 20 секунд, затем разблокируется без выхода (программа не откажет).

Любая помощь очень ценится!

+0

Есть ли другая сторона, отправляющая какие-либо данные? – McKay

+0

Конкретно, другая сторона отправляет символ NewLine? – I4V

+0

Я не уверен, как сказать, посылает ли другая сторона что-либо. Это мой первый проект TCP, LOL. –

ответ

0

Я думаю, что большая часть проблемы заключается в вашем предположении, что если в потоке есть символ, который вы проверяете с помощью StreamReader.Peek(), тогда у вас есть полная линейка контента. Там нет никакой гарантии (вы можете получить только «Hello wo» данных «Hello world \ n»), поэтому вызов ReadLine() будет заблокирован до получения '\n'.

Однако я не уверен, почему он ждет 20 секунд каждый раз, прежде чем вернуться. По умолчанию ReadTimeout для NetworkStream - Timeout.Infinite. Вы уверены, что соединение не прерывается сервером? Он может быть настроен на ожидание около 20 секунд «молчания» перед закрытием соединения (довольно распространенный).

В качестве альтернативы, вы также можете изменить свое состояние на while (connectionRead.Peek() > -1). Peek() возвращает целое число символов, а 0 - действительное значение ('\0').

+0

Я действительно пробовал -1 раньше и получил тот же результат. Я думаю, что вы правы в том, что сервер завершает соединение. Как вы предлагаете мне проверить, не получаю ли я полную строку кода? Или есть способ просто выводить то, что я получаю, даже если нет «\ n»? –

+0

Простым способом поместить все, что вы получаете в TextBox, было бы изменение содержимого цикла while на char c = (char) connectionRead.Read(); textBox4.AppendText (c.ToString() + "\ r \ n"); 'Это поместит данные, которые вы получите в поле по каждому символу. Если вы получаете мусор, вы, вероятно, получаете байты вне диапазона печатных символов, и вам нужно будет пройти через код и посмотреть, что такое значение 'c'. Что касается сервера, это зависит. С каким программным обеспечением вы разговариваете? – Nick

+0

Я пытаюсь поговорить с www.google.com через GET /HTTP/1.0. –

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