Python - การเขียนโปรแกรมเครือข่าย

Python ให้การเข้าถึงบริการเครือข่ายสองระดับ ในระดับต่ำคุณสามารถเข้าถึงการสนับสนุนซ็อกเก็ตพื้นฐานในระบบปฏิบัติการพื้นฐานซึ่งช่วยให้คุณใช้งานไคลเอนต์และเซิร์ฟเวอร์สำหรับทั้งโปรโตคอลที่เน้นการเชื่อมต่อและไม่มีการเชื่อมต่อ

Python ยังมีไลบรารีที่ให้การเข้าถึงระดับที่สูงขึ้นไปยังโปรโตคอลเครือข่ายระดับแอปพลิเคชันเฉพาะเช่น FTP, HTTP และอื่น ๆ

บทนี้จะช่วยให้คุณเข้าใจแนวคิดที่มีชื่อเสียงที่สุดในระบบเครือข่าย - การเขียนโปรแกรมซ็อกเก็ต

Sockets คืออะไร?

ซ็อกเก็ตเป็นจุดสิ้นสุดของช่องทางการสื่อสารแบบสองทิศทาง ซ็อกเก็ตอาจสื่อสารภายในกระบวนการระหว่างกระบวนการบนเครื่องเดียวกันหรือระหว่างกระบวนการในทวีปต่างๆ

อาจนำซ็อกเก็ตไปใช้กับแชนเนลประเภทต่างๆ: ซ็อกเก็ตโดเมน Unix, TCP, UDP และอื่น ๆ ซ็อกเก็ตห้องสมุดให้เรียนที่เฉพาะเจาะจงสำหรับการจัดการระบบขนส่งทั่วไปเช่นเดียวกับอินเตอร์เฟซสำหรับการจัดการทั่วไปส่วนที่เหลือ

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

โมดูลอินเทอร์เน็ต Python

รายการโมดูลที่สำคัญบางอย่างในการเขียนโปรแกรม Python Network / Internet

มาตรการ ฟังก์ชันทั่วไป หมายเลขพอร์ต โมดูล Python
HTTP หน้าเว็บ 80 HTTplib, urllib, xmlrpclib
NNTP ข่าว Usenet 119 nntplib
FTP การถ่ายโอนไฟล์ 20 ftplib, urllib
SMTP การส่งอีเมล 25 smtplib
POP3 กำลังเรียกอีเมล 110 ป๊อปลิบ
IMAP4 กำลังเรียกอีเมล 143 imaplib
Telnet บรรทัดคำสั่ง 23 เทลเน็ตลิบ
โกเฟอร์ การถ่ายโอนเอกสาร 70 gopherlib, urllib

โปรดตรวจสอบไลบรารีทั้งหมดที่กล่าวถึงข้างต้นเพื่อทำงานกับโปรโตคอล FTP, SMTP, POP และ IMAP

อ่านเพิ่มเติม

นี่เป็นการเริ่มต้นอย่างรวดเร็วด้วย Socket Programming มันเป็นเรื่องที่มากมาย ขอแนะนำให้ไปที่ลิงค์ต่อไปนี้เพื่อดูรายละเอียดเพิ่มเติม -

  • การเขียนโปรแกรมระบบปฏิบัติการยูนิกซ์ซ็อกเก็ต

  • งูหลามซ็อกเก็ตและห้องสมุดโมดูล