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

ตัวระบุของอินเทอร์เฟซเครือข่าย -

  • สตริงซึ่งอาจเป็นชื่อโฮสต์ที่อยู่แบบจุด - รูปสี่เหลี่ยมหรือที่อยู่ IPV6 ในเครื่องหมายโคลอน (และอาจเป็นจุด)

  • สตริง "<broadcast>" ซึ่งระบุที่อยู่ INADDR_BROADCAST

  • สตริงที่มีความยาวเป็นศูนย์ซึ่งระบุ INADDR_ANY หรือ

  • จำนวนเต็มตีความเป็นที่อยู่ไบนารีในลำดับไบต์ของโฮสต์

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