Python - การเขียนโปรแกรม Sockets
Python ให้การเข้าถึงบริการเครือข่ายสองระดับ ในระดับต่ำคุณสามารถเข้าถึงการสนับสนุนซ็อกเก็ตพื้นฐานในระบบปฏิบัติการพื้นฐานซึ่งช่วยให้คุณใช้งานไคลเอนต์และเซิร์ฟเวอร์สำหรับทั้งโปรโตคอลที่เน้นการเชื่อมต่อและไม่มีการเชื่อมต่อ
Python ยังมีไลบรารีที่ให้การเข้าถึงระดับที่สูงขึ้นไปยังโปรโตคอลเครือข่ายระดับแอปพลิเคชันเฉพาะเช่น FTP, HTTP และอื่น ๆ
ซ็อกเก็ตเป็นจุดสิ้นสุดของช่องทางการสื่อสารแบบสองทิศทาง ซ็อกเก็ตอาจสื่อสารภายในกระบวนการระหว่างกระบวนการในเครื่องเดียวกันหรือระหว่างกระบวนการในทวีปต่างๆ เราใช้โมดูลซ็อกเก็ตใน python เพื่อสร้างและใช้ซ็อกเก็ต
Sockets มีคำศัพท์ของตัวเอง -
ซีเนียร์ | ข้อกำหนดและคำอธิบาย |
---|---|
1 | Domain ตระกูลของโปรโตคอลที่ใช้เป็นกลไกการขนส่ง ค่าเหล่านี้เป็นค่าคงที่เช่น AF_INET, PF_INET, PF_UNIX, PF_X25 เป็นต้น |
2 | type ประเภทของการสื่อสารระหว่างปลายทางทั้งสองโดยทั่วไปคือ SOCK_STREAM สำหรับโปรโตคอลที่เน้นการเชื่อมต่อและ SOCK_DGRAM สำหรับโปรโตคอลที่ไม่มีการเชื่อมต่อ |
3 | protocol โดยทั่วไปเป็นศูนย์อาจใช้เพื่อระบุตัวแปรของโปรโตคอลภายในโดเมนและประเภท |
4 | hostname ตัวระบุของอินเทอร์เฟซเครือข่าย -
|
5 | port แต่ละเซิร์ฟเวอร์จะรับฟังไคลเอ็นต์ที่เรียกใช้พอร์ตอย่างน้อยหนึ่งพอร์ต พอร์ตอาจเป็นหมายเลขพอร์ต Fixnum สตริงที่มีหมายเลขพอร์ตหรือชื่อของบริการ |
ซ็อกเก็ตโมดูล
ในการสร้างซ็อกเก็ตคุณต้องใช้ฟังก์ชัน socket.socket () ที่มีอยู่ในโมดูลซ็อกเก็ตซึ่งมีไวยากรณ์ทั่วไป -
s = socket.socket (socket_family, socket_type, protocol=0)
นี่คือคำอธิบายของพารามิเตอร์ -
socket_family - นี่คือ AF_UNIX หรือ AF_INET ตามที่อธิบายไว้ก่อนหน้านี้
socket_type - นี่คือ SOCK_STREAM หรือ SOCK_DGRAM
protocol - โดยปกติจะถูกปล่อยทิ้งไว้โดยเริ่มต้นเป็น 0
เมื่อคุณมีวัตถุซ็อกเก็ตแล้วคุณสามารถใช้ฟังก์ชันที่จำเป็นเพื่อสร้างโปรแกรมไคลเอนต์หรือเซิร์ฟเวอร์ของคุณ
วิธีการซ็อกเก็ตเซิร์ฟเวอร์
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | s.bind() วิธีนี้ผูกแอดเดรส (ชื่อโฮสต์คู่หมายเลขพอร์ต) กับซ็อกเก็ต |
2 | s.listen() วิธีนี้ตั้งค่าและเริ่มตัวฟัง TCP |
3 | s.accept() สิ่งนี้ยอมรับการเชื่อมต่อไคลเอนต์ TCP แบบไม่อดทนรอจนกว่าการเชื่อมต่อจะมาถึง (การบล็อก) |
วิธีการซ็อกเก็ตไคลเอนต์
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | s.connect() วิธีนี้เริ่มการเชื่อมต่อเซิร์ฟเวอร์ TCP อย่างแข็งขัน |
วิธีการทั่วไปของซ็อกเก็ต
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | s.recv() วิธีนี้ได้รับข้อความ TCP |
2 | s.send() วิธีนี้ส่งข้อความ TCP |
3 | s.recvfrom() วิธีนี้ได้รับข้อความ UDP |
4 | s.sendto() วิธีนี้ส่งข้อความ UDP |
5 | s.close() วิธีนี้จะปิดซ็อกเก็ต |
6 | socket.gethostname() ส่งคืนชื่อโฮสต์ |
เซิร์ฟเวอร์ที่เรียบง่าย
ในการเขียนอินเทอร์เน็ตเซิร์ฟเวอร์เราใช้ไฟล์ socketฟังก์ชันที่มีอยู่ในโมดูลซ็อกเก็ตเพื่อสร้างอ็อบเจ็กต์ซ็อกเก็ต จากนั้นอ็อบเจ็กต์ซ็อกเก็ตจะถูกใช้เพื่อเรียกใช้ฟังก์ชันอื่น ๆ เพื่อตั้งค่าเซิร์ฟเวอร์ซ็อกเก็ต
ตอนนี้โทร bind(hostname, port)ฟังก์ชันเพื่อระบุพอร์ตสำหรับบริการของคุณบนโฮสต์ที่กำหนด
จากนั้นเรียกใช้วิธีการยอมรับของวัตถุที่ส่งคืน วิธีนี้รอจนกว่าไคลเอ็นต์จะเชื่อมต่อกับพอร์ตที่คุณระบุจากนั้นส่งคืนอ็อบเจ็กต์การเชื่อมต่อที่แสดงถึงการเชื่อมต่อกับไคลเอ็นต์นั้น
#!/usr/bin/python # This is server.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.bind((host, port)) # Bind to the port
s.listen(5) # Now wait for client connection.
while True:
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
c.send('Thank you for connecting')
c.close() # Close the connection
ลูกค้าธรรมดา
ให้เราเขียนโปรแกรมไคลเอนต์ที่เรียบง่ายมากซึ่งเปิดการเชื่อมต่อกับพอร์ต 12345 และโฮสต์ที่กำหนด นี่เป็นเรื่องง่ายมากในการสร้างไคลเอนต์ซ็อกเก็ตโดยใช้ฟังก์ชันโมดูลซ็อกเก็ตของ Python
socket.connect(hosname, port )เปิดเชื่อมต่อ TCP ชื่อโฮสต์บนพอร์ต เมื่อคุณเปิดซ็อกเก็ตแล้วคุณสามารถอ่านได้เหมือนกับอ็อบเจ็กต์ IO ใด ๆ เมื่อเสร็จแล้วอย่าลืมปิดเช่นเดียวกับที่คุณปิดไฟล์
รหัสต่อไปนี้เป็นไคลเอนต์ที่เรียบง่ายมากที่เชื่อมต่อกับโฮสต์และพอร์ตที่กำหนดอ่านข้อมูลที่มีอยู่จากซ็อกเก็ตแล้วออก -
#!/usr/bin/python # This is client.py file
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.connect((host, port))
print s.recv(1024)
s.close # Close the socket when done
ตอนนี้เรียกใช้ server.py นี้ในพื้นหลังจากนั้นเรียกใช้บน client.py เพื่อดูผลลัพธ์
# Following would start a server in background.
$ python server.py & # Once server is started run client as follows: $ python client.py
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Got connection from ('127.0.0.1', 48437)
Thank you for connecting
ซ็อกเก็ตที่มี URL สาธารณะ
ในตัวอย่างด้านล่างเราใช้วิธีการบางอย่างจากโมดูลซ็อกเก็ตเพื่อค้นหาข้อมูลที่อยู่ของเซิร์ฟเวอร์และรายละเอียดชื่อโฮสต์
import socket
from pprint import pprint
# get server address
addrinfo = socket.getaddrinfo('tutorialspoint.com', 'www')
pprint(addrinfo)
# get server hostname
print socket.gethostname()
เมื่อเรารันโปรแกรมข้างต้นเราจะได้ผลลัพธ์ดังต่อไปนี้ -
[(2, 1, 0, '', ('94.130.81.180', 80))]
DESKTOP-JXYKQCPLP