ภาพรวม
Namespace System.Net.Sockets จัดเตรียมการทำงานกับ Socket สำหรับการสื่อสารเครือข่าย TCP/IP มี 2 โหมด: Synchronous (บล็อก) และ Asynchronous (non-blocking)
คลาสหลัก
| คลาส | หน้าที่ |
|---|---|
TcpListener | ฝั่ง Server: ฟังการเชื่อมต่อ TCP |
TcpClient | ฝั่ง Client: เชื่อมต่อไปยัง Server |
Socket | Low-level socket operations |
NetworkStream | Stream สำหรับอ่าน/เขียนข้อมูลผ่าน 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สำหรับแอปพลิเคชันจริง