Bagikan melalui


Menggunakan Soket untuk mengirim dan menerima data melalui TCP

Sebelum Anda dapat menggunakan soket untuk berkomunikasi dengan perangkat jarak jauh, soket harus diinisialisasi dengan informasi protokol dan alamat jaringan. Konstruktor untuk kelas Socket memiliki parameter yang menentukan keluarga alamat, jenis soket, dan jenis protokol yang digunakan soket untuk membuat koneksi. Saat menyambungkan soket klien ke soket server, klien akan menggunakan IPEndPoint objek untuk menentukan alamat jaringan server.

Membuat titik akhir IP

Saat bekerja dengan System.Net.Sockets, Anda mewakili titik akhir jaringan sebagai IPEndPoint objek. IPEndPoint dibangun dengan IPAddress dan nomor port yang sesuai. Sebelum dapat memulai percakapan melalui Socket, Anda membuat pipa data antara aplikasi dan tujuan jarak jauh.

TCP/IP menggunakan alamat jaringan dan nomor port layanan untuk mengidentifikasi layanan secara unik. Alamat jaringan mengidentifikasi tujuan jaringan tertentu; nomor port mengidentifikasi layanan tertentu pada perangkat tersebut untuk disambungkan. Kombinasi alamat jaringan dan port layanan disebut titik akhir, yang diwakili dalam .NET oleh EndPoint kelas . Keturunan EndPoint didefinisikan untuk setiap keluarga alamat yang didukung; untuk keluarga alamat IP, kelasnya adalah IPEndPoint.

Kelas ini Dns menyediakan layanan nama domain ke aplikasi yang menggunakan layanan internet TCP/IP. Metode ini GetHostEntryAsync meminta server DNS untuk memetakan nama domain yang mudah digunakan (seperti "host.contoso.com") ke alamat Internet numerik (seperti 192.168.1.1). GetHostEntryAsyncTask<IPHostEntry> mengembalikan yang ketika ditunggu berisi daftar alamat dan alias untuk nama yang diminta. Dalam kebanyakan kasus, Anda dapat menggunakan alamat pertama yang dikembalikan dalam larik AddressList. Kode berikut mendapatkan alamat IP yang IPAddress berisi untuk server host.contoso.com.

IPHostEntry ipHostInfo = await Dns.GetHostEntryAsync("host.contoso.com");
IPAddress ipAddress = ipHostInfo.AddressList[0];

Tip

Untuk tujuan pengujian dan penelusuran kesalahan manual, Anda biasanya dapat menggunakan GetHostEntryAsync metode dengan nama host yang dihasilkan dari Dns.GetHostName() nilai untuk menyelesaikan nama localhost ke alamat IP. Perhatikan cuplikan kode berikut:

var hostName = Dns.GetHostName();
IPHostEntry localhost = await Dns.GetHostEntryAsync(hostName);
// This is the IP address of the local machine
IPAddress localIpAddress = localhost.AddressList[0];

Internet Assigned Numbers Authority (IANA) menentukan nomor port untuk layanan umum. Untuk informasi selengkapnya, lihat IANA: Nama Layanan dan Registri Nomor Port Protokol Transportasi). Layanan lain dapat memiliki nomor port terdaftar dalam kisaran 1.024 hingga 65.535. Kode berikut menggabungkan alamat IP untuk host.contoso.com dengan nomor port untuk membuat titik akhir jarak jauh untuk koneksi.

IPEndPoint ipEndPoint = new(ipAddress, 11_000);

Setelah menentukan alamat perangkat jarak jauh dan memilih port yang akan digunakan untuk koneksi, aplikasi dapat membuat koneksi dengan perangkat jarak jauh.

Membuat Socket klien

Dengan objek yang endPoint dibuat, buat soket klien untuk menyambungkan ke server. Setelah soket tersambung, soket dapat mengirim dan menerima data dari koneksi soket server.

using Socket client = new(
    ipEndPoint.AddressFamily, 
    SocketType.Stream, 
    ProtocolType.Tcp);

await client.ConnectAsync(ipEndPoint);
while (true)
{
    // Send message.
    var message = "Hi friends 👋!<|EOM|>";
    var messageBytes = Encoding.UTF8.GetBytes(message);
    _ = await client.SendAsync(messageBytes, SocketFlags.None);
    Console.WriteLine($"Socket client sent message: \"{message}\"");

    // Receive ack.
    var buffer = new byte[1_024];
    var received = await client.ReceiveAsync(buffer, SocketFlags.None);
    var response = Encoding.UTF8.GetString(buffer, 0, received);
    if (response == "<|ACK|>")
    {
        Console.WriteLine(
            $"Socket client received acknowledgment: \"{response}\"");
        break;
    }
    // Sample output:
    //     Socket client sent message: "Hi friends 👋!<|EOM|>"
    //     Socket client received acknowledgment: "<|ACK|>"
}

client.Shutdown(SocketShutdown.Both);

Kode C# sebelumnya:

  • Membuat instans objek baru Socket dengan keluarga alamat instans tertentu endPoint , SocketType.Stream, dan ProtocolType.Tcp.

  • Memanggil metode dengan endPoint instans Socket.ConnectAsync sebagai argumen.

  • Dalam perulangan while :

    • Mengodekan dan mengirim pesan ke server menggunakan Socket.SendAsync.
    • Menulis pesan terkirim ke konsol.
    • Menginisialisasi buffer untuk menerima data dari server menggunakan Socket.ReceiveAsync.
    • response Ketika adalah pengakuan, itu ditulis ke konsol dan perulangan keluar.
  • Terakhir, client panggilan Socket.Shutdown soket yang diberikan SocketShutdown.Both, yang mematikan operasi kirim dan terima.

Membuat Socket server

Untuk membuat soket server, endPoint objek dapat mendengarkan koneksi masuk pada alamat IP apa pun tetapi nomor port harus ditentukan. Setelah soket dibuat, server dapat menerima koneksi masuk dan berkomunikasi dengan klien.

using Socket listener = new(
    ipEndPoint.AddressFamily,
    SocketType.Stream,
    ProtocolType.Tcp);

listener.Bind(ipEndPoint);
listener.Listen(100);

var handler = await listener.AcceptAsync();
while (true)
{
    // Receive message.
    var buffer = new byte[1_024];
    var received = await handler.ReceiveAsync(buffer, SocketFlags.None);
    var response = Encoding.UTF8.GetString(buffer, 0, received);
    
    var eom = "<|EOM|>";
    if (response.IndexOf(eom) > -1 /* is end of message */)
    {
        Console.WriteLine(
            $"Socket server received message: \"{response.Replace(eom, "")}\"");

        var ackMessage = "<|ACK|>";
        var echoBytes = Encoding.UTF8.GetBytes(ackMessage);
        await handler.SendAsync(echoBytes, 0);
        Console.WriteLine(
            $"Socket server sent acknowledgment: \"{ackMessage}\"");

        break;
    }
    // Sample output:
    //    Socket server received message: "Hi friends 👋!"
    //    Socket server sent acknowledgment: "<|ACK|>"
}

Kode C# sebelumnya:

  • Membuat instans objek baru Socket dengan keluarga alamat instans tertentu endPoint , SocketType.Stream, dan ProtocolType.Tcp.

  • Memanggil listener metode dengan endPoint instans Socket.Bind sebagai argumen untuk mengaitkan soket dengan alamat jaringan.

  • Metode Socket.Listen() ini dipanggil untuk mendengarkan koneksi masuk.

  • Memanggil listenerSocket.AcceptAsync metode untuk menerima koneksi masuk pada handler soket.

  • Dalam perulangan while :

    • Socket.ReceiveAsync Panggilan untuk menerima data dari klien.
    • Saat data diterima, data akan didekode dan ditulis ke konsol.
    • response Jika pesan berakhir dengan <|EOM|>, pengakuan dikirim ke klien menggunakan Socket.SendAsync.

Jalankan klien sampel dan server

Mulai aplikasi server terlebih dahulu, lalu mulai aplikasi klien.

dotnet run --project socket-server
Socket server starting...
Found: 172.23.64.1 available on port 9000.
Socket server received message: "Hi friends 👋!"
Socket server sent acknowledgment: "<|ACK|>"
Press ENTER to continue...

Aplikasi klien akan mengirim pesan ke server, dan server akan merespons dengan pengakuan.

dotnet run --project socket-client
Socket client starting...
Found: 172.23.64.1 available on port 9000.
Socket client sent message: "Hi friends 👋!<|EOM|>"
Socket client received acknowledgment: "<|ACK|>"
Press ENTER to continue...

Lihat juga