Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Socket Programming ใน C#: TCP/IP Network Communication

ภาพรวม

Namespace System.Net.Sockets จัดเตรียมการทำงานกับ Socket สำหรับการสื่อสารเครือข่าย TCP/IP มี 2 โหมด: Synchronous (บล็อก) และ Asynchronous (non-blocking)

คลาสหลัก

คลาสหน้าที่
TcpListenerฝั่ง Server: ฟังการเชื่อมต่อ TCP
TcpClientฝั่ง Client: เชื่อมต่อไปยัง Server
SocketLow-level socket operations
NetworkStreamStream สำหรับอ่าน/เขียนข้อมูลผ่าน Socket

ตัวอย่าง Server (TcpListener)


using System;
using System.Net;
using System.Net.Sockets;
using System.IO;

public class TcpServer {
    public static void Main() {
        TcpListener listener = new TcpListener(IPAddress.Any, 1234);
        listener.Start();
        Console.WriteLine("Server started on port 1234...");

        while (true) {
            TcpClient client = listener.AcceptTcpClient();
            Console.WriteLine($"Client connected: {client.Client.RemoteEndPoint}");

            using (NetworkStream stream = client.GetStream())
            using (StreamReader reader = new StreamReader(stream))
            using (StreamWriter writer = new StreamWriter(stream) { AutoFlush = true }) {
                string message = reader.ReadLine();
                Console.WriteLine($"Received: {message}");
                writer.WriteLine("Echo: " + message);
            }
            client.Close();
        }
    }
}

ตัวอย่าง Client (TcpClient)


using System;
using System.Net.Sockets;
using System.IO;

public class TcpClientDemo {
    public static void Main() {
        using (TcpClient client = new TcpClient("127.0.0.1", 1234))
        using (NetworkStream stream = client.GetStream())
        using (StreamReader reader = new StreamReader(stream))
        using (StreamWriter writer = new StreamWriter(stream) { AutoFlush = true }) {
            writer.WriteLine("Hello Server!");
            string response = reader.ReadLine();
            Console.WriteLine($"Server: {response}");
        }
    }
}

การสร้าง Socket แบบ Low-level


Socket socket = new Socket(
    AddressFamily.InterNetwork,  // IPv4
    SocketType.Stream,           // TCP (Stream)
    ProtocolType.Tcp             // TCP protocol
);

พารามิเตอร์ Socket

  • AddressFamily.InterNetwork: IPv4 (ใช้ InterNetworkV6 สำหรับ IPv6)
  • SocketType.Stream: TCP (เชื่อมต่อแบบ reliable, ordered)
  • SocketType.Dgram: UDP (connectionless)
  • ProtocolType.Tcp/Udp: โปรโตคอลเครือข่าย

แนวทางปฏิบัติสมัยใหม่

  • ใช้ async/await กับ NetworkStream.ReadAsync/WriteAsync
  • ใช้ TcpListener.AcceptTcpClientAsync() สำหรับ non-blocking accept
  • พิจารณาใช้ library ระดับสูงกว่าเช่น SignalR, gRPC, WebSockets สำหรับแอปพลิเคชันจริง