2015-06-26 3 views
1

Я следую этому руководству «http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server» при настройке мини-сервера, который может отправлять и получать сообщения и подключать несколько клиентов.Получение сообщений как TcpClient

Все работает отлично. Но, к сожалению, одна вещь, которая отсутствует в этом учебнике, заключается в том, как клиент может настроить слушателя для прослушивания сервера.

У меня есть только это много:

public void SetupReceiver() 
{ 
     TcpClient tcpClient = new TcpClient(this.Host, this.Port); 
     NetworkStream networkStream = tcpClient.GetStream(); 

     // What next! :(or is this already wrong... 
} 

Насколько я могу себе представить .. я должен был бы подключиться к серверу (как TcpClient) и получить поток (как выше). А потом дождитесь сообщений и сделайте что-нибудь с ним. Причина, по которой я не могу просто заставить клиента получить сообщение с сервера сразу после его отправки, заключается в том, что клиент отправит сообщение на сервер, а затем это сообщение будет передано всем подключенным клиентам. Поэтому каждый клиент должен «слушать» сообщения с сервера.

+1

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

+0

А ... Я думал, что это было только для серверной части, а не для клиентской стороны ... Хорошо, попробуй и повторите это сейчас :) – Zephni

ответ

3

TcpClient класс имеет необходимые ресурсы для обеспечения связи, отправлять и получать данные с сервера и TcpListener класс существенно сервер.

Следуя общей пример на странице MSDN для TcpClient, а также может быть использован для TcpListener (из которых мое обобщенное объяснение на основе!)

https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient%28v=vs.110%29.aspx

Первая часть для отправки данных на сервер:

// Translate the passed message into ASCII and store it as a Byte array. 
Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);   

// Get a client stream for reading and writing. 
NetworkStream stream = client.GetStream(); 

// Send the message to the connected TcpServer. 
stream.Write(data, 0, data.Length); //(**This is to send data using the byte method**) 

Следующая часть предназначена для получения данных с сервера:

// Buffer to store the response bytes. 
data = new Byte[256]; 

// String to store the response ASCII representation. 
String responseData = String.Empty; 

// Read the first batch of the TcpServer response bytes. 
Int32 bytes = stream.Read(data, 0, data.Length); //(**This receives the data using the byte method**) 
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); //(**This converts it to string**) 

Метод байт может быть заменен StreamReader и StreamWriter, когда они были связаны с NetworkStream

Надежда это помогает !!

** PS: Если вы хотите использовать более универсальное кодирование с сетевыми классами в C#, я лично рекомендую изучить использование сокетов, поскольку это основной класс, из которого родились tcpclient и tcplistener.

+0

Привет, спасибо за ваш ответ! И очень жаль моего позднего ответа. Могу ли я просто добавить вопрос к вопросу и спросить, куда должен идти код «получать данные от сервера». Как клиент будет «ждать» для получения данных? Причина, по которой я спрашиваю, заключается в том, что сервер передает сообщение другим клиентам, поэтому ответ будет получен не только клиенту, который отправил исходное сообщение – Zephni

+0

. Хорошо, тогда вам, возможно, придется создать метод, который будет отправлять одно и то же сообщение каждому индивидуальное подключение.Tcp - одно соединение, в то время как, например, UDP (хотя и менее безопасный и менее надежный, если вы хотите, чтобы все, чтобы перейти от пункта a к b), транслировало сообщения намного проще. Насколько я знаю, нет способа транслировать tcp wirhout на велосипеде через каждое соединение – Viralwarrior012

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