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

Socket Programming ใน Python

ในการสื่อสารสองทาง (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 แล้ว