โมดูล 'ซ็อกเก็ต' ในไลบรารีมาตรฐานของ Python กำหนดวิธีที่เครื่องเซิร์ฟเวอร์และเครื่องไคลเอนต์สามารถสื่อสารโดยใช้จุดปลายซ็อกเก็ตที่ด้านบนของระบบปฏิบัติการ API 'socket' ประกอบด้วยฟังก์ชันสำหรับโปรโตคอลเครือข่ายที่เน้นการเชื่อมต่อและไม่ต้องใช้การเชื่อมต่อ
ซ็อกเก็ตเป็นจุดสิ้นสุดของลิงก์การสื่อสารแบบสองทาง มีลักษณะเฉพาะตามที่อยู่ IP และหมายเลขพอร์ต จำเป็นต้องมีการกำหนดค่าซ็อกเก็ตที่ปลายทั้งสองด้านอย่างเหมาะสมเพื่อเริ่มต้นการเชื่อมต่อ ทำให้สามารถฟังข้อความที่เข้ามาแล้วส่งการตอบกลับในสภาพแวดล้อมแบบไคลเอนต์-เซิร์ฟเวอร์
ฟังก์ชัน socket() ในโมดูล 'socket' จะตั้งค่าอ็อบเจกต์ซ็อกเก็ต
import socket obj = socket.socket(family, type, protocol)
อาร์กิวเมนต์ 'family' คือ AF_INET โดยค่าเริ่มต้น ค่าอื่นๆ ที่ยอมรับได้ ได้แก่ AF_INET6, AF_UNIX, AF_CAN หรือ AF_RDS ค่าของอาร์กิวเมนต์ 'type' เป็นค่าเริ่มต้น 'SOCK_STREAM' ซึ่งระบุถึงโปรโตคอลที่เน้นการเชื่อมต่อ (TCP) สำหรับโปรโตคอลที่ไม่มีการเชื่อมต่อ (UDP) ให้ตั้งค่าเป็น 'SOCK_DGRAM' อาร์กิวเมนต์ 'โปรโตคอล' มักจะถูกตั้งค่าเป็น 0 โดยค่าเริ่มต้น
อ็อบเจ็กต์ซ็อกเก็ตบนเซิร์ฟเวอร์และไคลเอนต์เรียกว่าซ็อกเก็ตเซิร์ฟเวอร์และซ็อกเก็ตไคลเอนต์ตามลำดับ วัตถุซ็อกเก็ตใช้วิธีการดังต่อไปนี้
ผูก () | วิธีนี้จะผูกซ็อกเก็ตกับที่อยู่ IP และหมายเลขพอร์ตที่ระบุ |
ฟัง() | เมธอดนี้เริ่มเซิร์ฟเวอร์และรันเป็นฟังวนเพื่อมองหาคำขอเชื่อมต่อจากไคลเอนต์ |
ยอมรับ() | เมื่อเซิร์ฟเวอร์สกัดกั้นคำขอเชื่อมต่อ เมธอดนี้จะยอมรับและระบุที่อยู่ของซ็อกเก็ตไคลเอ็นต์ |
รหัสฝั่งเซิร์ฟเวอร์โดยทั่วไปจะเป็น
import socket ss = socket.socket() ss.bind(('localhost',12345)) ss.listen() client, addr = ss.accept() print ("connection request from: " + str(addr))
หากใช้เครื่องในเครื่องเป็นเซิร์ฟเวอร์เพื่อฟังข้อความขาเข้าจากเครื่องเดียวกันกับไคลเอ็นต์ ที่อยู่ IP ของมันคือ '127.0.0.1' หรือที่เรียกว่าที่อยู่ย้อนกลับ มันถูกระบุโดยชื่อโฮสต์ของ 'localhost' ซ็อกเก็ตทำขึ้นเพื่อฟังที่หมายเลขพอร์ตว่างโดยพลการ สำหรับการสื่อสารระหว่างเครื่องที่อยู่ห่างไกลในเครือข่าย ต้องใช้ที่อยู่ IP จริง
ซ็อกเก็ตไคลเอนต์ส่งคำขอเชื่อมต่อไปยังซ็อกเก็ตเซิร์ฟเวอร์ที่รับฟังที่อยู่ IP และหมายเลขพอร์ต
เชื่อมต่อ()
obj = socket.socket() obj.connect((host,port))
เมื่อเซิร์ฟเวอร์ยอมรับคำขอเชื่อมต่อจากไคลเอ็นต์แล้ว ทั้งวัตถุซ็อกเก็ตจะเชื่อมต่อโดยใช้โปรโตคอล TCP และสามารถส่งและ/หรือรับข้อมูลได้
ส่ง()
เซิร์ฟเวอร์ส่งข้อมูลไปยังไคลเอนต์โดยใช้ที่อยู่ที่ถูกสกัดกั้น
client.send(bytes)
ซ็อกเก็ตไคลเอนต์ส่งข้อมูลไปยังซ็อกเก็ตที่สร้างการเชื่อมต่อด้วย
obj.send(bytes)
sendall()
คล้ายกับ send() วิธีการนี้จะส่งข้อมูลต่อไปจนกว่าจะมีการส่งข้อมูลทั้งหมด
ส่งไปยัง()
วิธีนี้ใช้ในกรณีของโปรโตคอล UDP เท่านั้น
recv()
วิธีนี้ใช้เพื่อดึงข้อมูลที่ส่งไปยังไคลเอนต์ ในกรณีของเซิร์ฟเวอร์ จะใช้รีโมตซ็อกเก็ตที่คำขอได้รับการยอมรับ
client.recv(bytes)
กรณีลูกค้า
obj.recv(bytes)
recvfrom()
วิธีนี้ใช้ในกรณีของโปรโตคอล UDP
รหัสเซิร์ฟเวอร์
import socket host = "127.0.0.1" port = 12345 ss = socket.socket() ss.bind((host,port)) ss.listen() cs, addr = server.accept() print ("Connection from: " + str(addr)) while True: data = cs.recv(1024).decode() if not data: break print ("from connected user: " + str(data)) print ("Received from User: " + str(data)) data = input("type message: ") conn.send(data.encode()) cs.close()
รหัสลูกค้า
import socket host = '127.0.0.1' port = 12345 obj = socket.socket() obj.connect((host,port)) message = input("type message: ") while message != 'q': obj.send(message.encode()) data = obj.recv(1024).decode() print ('Received from server: ' + data) message = input("type message: ") obj.close()
เปิดหน้าต่างพรอมต์คำสั่งสองหน้าต่าง ในหนึ่งรันรหัสเซิร์ฟเวอร์ก่อน รหัสไคลเอ็นต์ที่รันอื่น ๆ