Сложность установления соединения с сервером в C # с использованием TcpClient и работы с NetworkStreams - PullRequest
0 голосов
/ 23 марта 2012

Я работаю над простым проектом для своего класса Data Communications. Я предсказывал, что это займет у меня максимум два часа, но я впервые пишу программное обеспечение, которое устанавливает соединение с Интернетом, и впервые работаю с C #, и я столкнулся с довольно серьезным препятствием.

Я установил соединение с сервером, но, похоже, не получил никакой обратной связи с сервером. Вот код, который я выполняю, чтобы установить соединение:

TcpClient conn = new TcpClient();
conn.Connect(host, port);
StreamReader reader = new StreamReader(conn.GetStream());
StreamWriter writer = new StreamWriter(conn.GetStream());
Console.WriteLine(conn.Connected);   //This line does print true.
//Console.WriteLine(reader.ReadLine());     I thought I'd get a message when I initially
//connected to the server but this line would hang

Вот где я устанавливаю соединение. В соответствии со спецификациями проекта, ввод 0 должен побудить сервер вернуть номер заявки. поэтому у меня есть следующий код:

writer.WriteLine("0");
return reader.ReadLine();

Prgram зависает при попытке выполнить reader.ReadLine (). Я пробовал другие методы в ридере, но, кажется, он завис на всех из них. Я посмотрел на множество примеров кода с настройками, похожими на мои. Кто-нибудь может увидеть какие-либо проблемы с моим кодом? Я не думаю, что это проблема с сервером. Мой профессор сказал что-то об использовании команды unix "telnet [host] [port]", и я использовал тот же хост и порт для этого кода. Я разрабатываю это на машине с Windows 7. Я прошу прощения за свое невежество как в C #, так и в сетевом программировании.

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

Спасибо огромное, ребята!

1 Ответ

4 голосов
/ 23 марта 2012

Вы должны убедиться, что записывающее устройство (и поток, который он переносит) сбрасывает свой вывод:

writer.WriteLine("0");
writer.Flush();
return reader.ReadLine();

Потоки часто буферизуют информацию для оптимизации ввода / вывода, потому что многие устройства ввода / вывода более эффективны с большими потоками данных, чем с короткими пакетами. Вероятно, ваш «0» слишком мал, чтобы поток мог что-либо отправить. Это относится и к таким вещам, как дисковый ввод-вывод (запись файлов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...