Sök…


Syntax

  • TcpClient (strängvärd, int-port);

Anmärkningar

Du kan hämta NetworkStream från en TcpClient med client.GetStream() och skicka den till en StreamReader/StreamWriter att få tillgång till deras async-läs- och skrivmetoder.

Grundläggande TCP-kommunikationsklient

Detta kodexempel skapar en TCP-klient, skickar "Hello World" över socketanslutningen och skriver sedan serverns svar till konsolen innan du stänger anslutningen.

// 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();

Ladda ner en fil från en webbserver

Nedladdning av en fil från internet är en mycket vanlig uppgift som krävs av nästan varje applikation du troligtvis kommer att bygga.

För att göra detta kan du använda klassen " System.Net.WebClient ".

Den enklaste användningen av detta, med "använda" -mönstret, visas nedan:

using (var webClient = new WebClient())
{
    webClient.DownloadFile("http://www.server.com/file.txt", "C:\\file.txt");
}

Vad det här exemplet gör är att det använder "att använda" för att se till att din webbklient städs upp korrekt när den är klar och helt enkelt överför den namngivna resursen från URL: en i den första parametern till den namngivna filen på din lokala hårddisk i den andra parameter.

Den första parametern är av typen " System.Uri ", den andra parametern är av typen " System.String "

Du kan också använda den här funktionen som en asyncform, så att den går av och utför nedladdningen i bakgrunden, medan din applikation börjar med något annat, att använda samtalet på detta sätt är av stor vikt i moderna applikationer, eftersom det hjälper för att hålla ditt användargränssnitt lyhört.

När du använder Async-metoderna kan du ansluta händelseshanterare som låter dig övervaka framstegen, så att du till exempel kan uppdatera en framstegsfält, något liknande följande:

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");

En viktig punkt att komma ihåg om du använder Async-versionerna emellertid, och det är "Var mycket försiktig när du använder dem i en" att använda "-syntax".

Anledningen till detta är ganska enkelt. När du väljer metoden för nedladdningsfil återgår den omedelbart. Om du har detta i ett användningsblock kommer du att återvända och sedan lämna blocket och omedelbart bortskaffa klassobjektet och därmed avbryta nedladdningen pågår.

Om du använder det "använda" sättet att utföra en Async-överföring, var noga med att hålla dig inne i det bifogade blocket tills överföringen är klar.

Async TCP-klient

Att använda async/await i C # -program förenklar flertrådar. Så här kan du använda async/await i samband med en 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();

Grundläggande UDP-klient

Detta kodexempel skapar en UDP-klient och skickar sedan "Hello World" över nätverket till den avsedda mottagaren. En lyssnare behöver inte vara aktiv, eftersom UDP är anslutningslös och kommer att sända meddelandet oavsett. När meddelandet har skickats är klienternas arbete gjort.

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());
}

Nedan är ett exempel på en UDP-lyssnare för att komplettera ovanstående klient. Den kommer ständigt att sitta och lyssna på trafik på en given port och helt enkelt skriva dessa data till konsolen. Detta exempel innehåller en kontrollflagg ' done ' som inte är inställd internt och förlitar sig på något för att ställa in detta för att möjliggöra slut på lyssnaren och avsluta.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow