ในการสื่อสารสองทาง (bidirectional) sockets เป็นปลายทางสองข้าง สามารถสื่อสารระหว่างกระบวนการบนเครื่องเดียวกันหรือข้ามทวีปได้
Sockets ถูก implement ผ่านช่องทางต่างๆ เช่น TCP, UDP
การสร้าง Socket
ต้องใช้โมดูล socket และฟังก์ชัน socket.socket()
Syntax
my_socket = socket.socket(socket_family, socket_type, protocol=0)
socket_family:AF_INET(IPv4),AF_INET6(IPv6),AF_UNIX(local)socket_type:SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
เมธอดสำคัญของ Server Socket
| เมธอด | คำอธิบาย |
|---|---|
bind((host, port)) | ผูกที่อยู่ (hostname, port) กับ socket |
listen(backlog) | ตั้งค่าและเริ่ม TCP listener |
accept() | รับ TCP client connection (blocking จนกว่าจะมีการเชื่อมต่อ) |
เมธอดสำคัญของ Client Socket
| เมธอด | คำอธิบาย |
|---|---|
connect((host, port)) | เริ่มการเชื่อมต่อ TCP server แบบ active |
General Socket Methods
| เมธอด | คำอธิบาย |
|---|---|
recv(bufsize) | รับข้อความ TCP |
send(bytes) | ส่งข้อความ TCP |
recvfrom(bufsize) | รับข้อความ UDP |
sendto(bytes, addr) | ส่งข้อความ UDP |
close() | ปิด socket |
gethostname() | คืน hostname ของเครื่อง |
ตัวอย่าง Server (TCP)
import socket
my_socket = socket.socket() # สร้าง socket object (default AF_INET, SOCK_STREAM)
my_host = socket.gethostname() # ชื่อโฮสต์ท้องถิ่น
my_port = 12345 # พอร์ตสำหรับบริการ
my_socket.bind((my_host, my_port))
my_socket.listen(5) # คิวสูงสุด 5 connections
print(f"Server listening on {my_host}:{my_port}")
while True:
conn, addr = my_socket.accept() # รอ client เชื่อมต่อ
print('Got connection from', addr)
conn.send(b'Thank you for connecting')
conn.close() # ปิด connection นี้
ตัวอย่าง Client (TCP)
import socket
my_socket = socket.socket()
my_host = socket.gethostname()
my_port = 12345
my_socket.connect((my_host, my_port))
print(my_socket.recv(1024).decode())
my_socket.close()
ตัวอย่าง UDP Server/Client
# UDP Server
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('localhost', 12345))
while True:
data, addr = s.recvfrom(1024)
print(f"Received from {addr}: {data.decode()}")
s.sendto(b'Echo: ' + data, addr)
# UDP Client
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(b'Hello UDP', ('localhost', 12345))
print(s.recvfrom(1024)[0].decode())
s.close()
ข้อสังเกต: ตัวอย่างต้นฉบับใช้ port 00000 ซึ่งไม่ถูกต้อง (port ต้องเป็น 1-65535) โค้ดด้านบนแก้เป็น 12345 แล้ว