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
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow