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

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

โมดูล 'socket' ในไลบรารีมาตรฐานของ Python กำหนดวิธีที่เซิร์ฟเวอร์และเครื่องไคลเอนต์สามารถสื่อสารกันได้โดยใช้ปลายทางโซเก็ต (socket endpoints) บนระบบปฏิบัติการ API โซเก็ตประกอบด้วยฟังก์ชันสำหรับโปรโตคอลเครือข่ายทั้งแบบเชื่อมต่อ (connection-oriented) และแบบไม่ต้องเชื่อมต่อ (connectionless)

โซเก็ตเป็นปลายทางของลิงก์การสื่อสารสองทาง ถูกกำหนดโดยที่อยู่ 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' อาร์กิวเมนต์ 'protocol' ปกติตั้งค่าเป็น 0 โดยค่าเริ่มต้น

อ็อบเจ็กต์โซเก็ตบนเซิร์ฟเวอร์และไคลเอนต์เรียกว่า เซิร์ฟเวอร์โซเก็ต และ ไคลเอนต์โซเก็ต ตามลำดับ อ็อบเจ็กต์โซเก็ตมีเมธอดดังต่อไปนี้:

bind() เมธอดนี้ผูกโซเก็ตกับที่อยู่ IP และหมายเลขพอร์ตที่ระบุ
listen() เมธอดนี้เริ่มเซิร์ฟเวอร์และเข้าสู่ลูปการรอ ค้นหาคำขอเชื่อมต่อจากไคลเอนต์
accept() เมื่อคำขอเชื่อมต่อถูกจับได้โดยเซิร์ฟเวอร์ เมธอดนี้ยอมรับและระบุโซเก็ตไคลเอนต์พร้อมที่อยู่ของมัน

โค้ดฝั่งเซิร์ฟเวอร์ทั่วไปจะเป็นดังนี้:

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' เรียกอีกอย่างว่า loopback address ระบุได้โดยโฮสต์เนม 'localhost' โซเก็ตจะรอที่พอร์ตว่างเปล่าผ่านการเลือกแบบสุ่ม สำหรับการสื่อสารระหว่างเครื่องที่อยู่ห่างกันในเครือข่าย ต้องใช้ที่อยู่ IP จริง

ไคลเอนต์โซเก็ตส่งคำขอเชื่อมต่อไปยังเซิร์ฟเวอร์โซเก็ตที่รออยู่ที่ที่อยู่ IP และพอร์ตของมัน:

connect()

obj = socket.socket()
obj.connect((host, port))

เมื่อคำขอเชื่อมต่อจากไคลเอนต์ถูกยอมรับโดยเซิร์ฟเวอร์ โซเก็ตทั้งสองจะเชื่อมต่อกันโดยใช้โปรโตคอล TCP และสามารถส่งและ/หรือรับข้อมูลได้

send()

เซิร์ฟเวอร์ส่งข้อมูลไปยังไคลเอนต์โดยใช้ที่อยู่ที่จับได้:

client.send(bytes)

ไคลเอนต์โซเก็ตส่งข้อมูลไปยังโซเก็ตที่ตั้งการเชื่อมต่อไว้:

obj.send(bytes)

sendall()

คล้ายกับ send() เมธอดนี้ส่งข้อมูลต่อเนื่องจนกว่าจะส่งข้อมูลทั้งหมดแล้ว

sendto()

เมธอดนี้ใช้ในกรณีของโปรโตคอล 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()

เปิดหน้าต่างคำสั่ง 2 หน้าต่าง ในหนึ่งรันโค้ดเซิร์ฟเวอร์ก่อน จากนั้นในอีกหนึ่งรันโค้ดไคลเอนต์

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