Szukaj…
Składnia
- TcpClient (host łańcucha, port wewnętrzny);
Uwagi
Możesz pobrać NetworkStream
z TcpClient
pomocą client.GetStream()
i przekazać go do StreamReader/StreamWriter
aby uzyskać dostęp do ich asynchronicznych metod odczytu i zapisu.
Podstawowy klient komunikacji TCP
Ten przykład kodu tworzy klienta TCP, wysyła „Hello World” przez połączenie przez gniazdo, a następnie zapisuje odpowiedź serwera do konsoli przed zamknięciem połączenia.
// Declare Variables
string host = "stackoverflow.com";
int port = 9999;
int timeout = 5000;
// Create TCP client and connect
using (var _client = new TcpClient(host, port))
using (var _netStream = _client.GetStream())
{
_netStream.ReadTimeout = timeout;
// Write a message over the socket
string message = "Hello World!";
byte[] dataToSend = System.Text.Encoding.ASCII.GetBytes(message);
_netStream.Write(dataToSend, 0, dataToSend.Length);
// Read server response
byte[] recvData = new byte[256];
int bytes = _netStream.Read(recvData, 0, recvData.Length);
message = System.Text.Encoding.ASCII.GetString(recvData, 0, bytes);
Console.WriteLine(string.Format("Server: {0}", message));
};// The client and stream will close as control exits the using block (Equivilent but safer than calling Close();
Pobierz plik z serwera WWW
Pobieranie pliku z Internetu jest bardzo częstym zadaniem wymaganym przez prawie każdą aplikację, którą prawdopodobnie zbudujesz.
Aby to osiągnąć, możesz użyć klasy „ System.Net.WebClient ”.
Najprostsze użycie tego, przy użyciu wzorca „using”, pokazano poniżej:
using (var webClient = new WebClient())
{
webClient.DownloadFile("http://www.server.com/file.txt", "C:\\file.txt");
}
W tym przykładzie wykorzystuje „używanie”, aby upewnić się, że klient WWW został poprawnie wyczyszczony po zakończeniu, i po prostu przenosi nazwany zasób z adresu URL w pierwszym parametrze do nazwanego pliku na lokalnym dysku twardym w drugim parametr.
Pierwszy parametr jest typu „ System.Uri ”, drugi parametr jest typu „ System.String ”
Możesz również skorzystać z tej funkcji, która jest formą asynchroniczną, dzięki czemu uruchamia się i wykonuje pobieranie w tle, podczas gdy twoja aplikacja zajmuje się czymś innym, korzystanie z wywołania w ten sposób ma duże znaczenie w nowoczesnych aplikacjach, ponieważ pomaga aby zachować responsywność interfejsu użytkownika.
Korzystając z metod asynchronicznych, można podłączyć moduły obsługi zdarzeń, które pozwalają monitorować postęp, dzięki czemu można na przykład zaktualizować pasek postępu, podobny do następującego:
var webClient = new WebClient())
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync("http://www.server.com/file.txt", "C:\\file.txt");
Należy jednak pamiętać o jednej ważnej kwestii, jeśli używasz wersji Async, a jest to: „Zachowaj ostrożność podczas używania ich w składni„ using ”.
Powód tego jest dość prosty. Po wywołaniu metody pobierania pliku zostanie ona natychmiast zwrócona. Jeśli masz to w używanym bloku, powrócisz, a następnie opuścisz ten blok i natychmiast usuniesz obiekt klasy, a tym samym anulujesz trwające pobieranie.
Jeśli użyjesz metody „using” do wykonania transferu asynchronicznego, pamiętaj, aby pozostać wewnątrz otaczającego bloku, dopóki transfer się nie zakończy.
Klient asynchronicznego TCP
Używanie async/await
w aplikacjach C # upraszcza wielowątkowość. W ten sposób można używać async/await
w połączeniu z klientem TcpClient.
// Declare Variables
string host = "stackoverflow.com";
int port = 9999;
int timeout = 5000;
// Create TCP client and connect
// Then get the netstream and pass it
// To our StreamWriter and StreamReader
using (var client = new TcpClient())
using (var netstream = client.GetStream())
using (var writer = new StreamWriter(netstream))
using (var reader = new StreamReader(netstream))
{
// Asynchronsly attempt to connect to server
await client.ConnectAsync(host, port);
// AutoFlush the StreamWriter
// so we don't go over the buffer
writer.AutoFlush = true;
// Optionally set a timeout
netstream.ReadTimeout = timeout;
// Write a message over the TCP Connection
string message = "Hello World!";
await writer.WriteLineAsync(message);
// Read server response
string response = await reader.ReadLineAsync();
Console.WriteLine(string.Format($"Server: {response}"));
}
// The client and stream will close as control exits
// the using block (Equivilent but safer than calling Close();
Podstawowy klient UDP
Ten przykład kodu tworzy klienta UDP, a następnie wysyła „Hello World” przez sieć do zamierzonego odbiorcy. Odbiornik nie musi być aktywny, ponieważ UDP jest bezpołączeniowy i niezależnie nadaje. Po wysłaniu wiadomości praca klientów jest zakończona.
byte[] data = Encoding.ASCII.GetBytes("Hello World");
string ipAddress = "192.168.1.141";
string sendPort = 55600;
try
{
using (var client = new UdpClient())
{
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), sendPort);
client.Connect(ep);
client.Send(data, data.Length);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Poniżej znajduje się przykład detektora UDP w celu uzupełnienia powyższego klienta. Będzie stale siedział i nasłuchiwał ruchu na danym porcie i po prostu zapisywał te dane w konsoli. Ten przykład zawiera flagę kontrolną „ done
”, która nie jest ustawiona wewnętrznie i polega na czymś, co pozwala ustawić zakończenie nasłuchiwania i wyjście z niego.
bool done = false;
int listenPort = 55600;
using(UdpClinet listener = new UdpClient(listenPort))
{
IPEndPoint listenEndPoint = new IPEndPoint(IPAddress.Any, listenPort);
while(!done)
{
byte[] receivedData = listener.Receive(ref listenPort);
Console.WriteLine("Received broadcast message from client {0}", listenEndPoint.ToString());
Console.WriteLine("Decoded data is:");
Console.WriteLine(Encoding.ASCII.GetString(receivedData)); //should be "Hello World" sent from above client
}
}