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

อินเทอร์เฟซเครือข่ายระดับต่ำใน Python (ซ็อกเก็ต)


โมดูล 'ซ็อกเก็ต' ในไลบรารีมาตรฐานของ 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()

เปิดหน้าต่างพรอมต์คำสั่งสองหน้าต่าง ในหนึ่งรันรหัสเซิร์ฟเวอร์ก่อน รหัสไคลเอ็นต์ที่รันอื่น ๆ

อินเทอร์เฟซเครือข่ายระดับต่ำใน Python (ซ็อกเก็ต)