การเขียนโปรแกรม Python เครือข่าย
งูหลามมีสองระดับของการให้บริการการเข้าถึงเครือข่าย :
- บริการเครือข่ายในระดับต่ำเพื่อสนับสนุนซ็อกเก็ตขั้นพื้นฐานก็ให้มาตรฐาน BSD Sockets API คุณสามารถเข้าถึงทุกวิธีการของอินเตอร์เฟซซ็อกเก็ตระบบปฏิบัติการพื้นฐาน
- ระดับสูงของเครือข่ายบริการโมดูล SocketServer จะให้ระดับเซิร์ฟเวอร์กลางคุณสามารถลดความซับซ้อนของการพัฒนาของเซิร์ฟเวอร์เครือข่าย
ซ็อกเก็ตคืออะไร?
ซ็อกเก็ตที่เรียกว่า "ซ็อกเก็ต" แอพลิเคชันมักจะออกโดย "ซ็อกเก็ต" เพื่อการร้องขอหรือเครือข่ายการตอบสนองต่อการร้องขอเพื่อให้กระบวนการระหว่างโฮสต์หรือระหว่างคอมพิวเตอร์บนสามารถสื่อสาร
ซ็อกเก็ต () ฟังก์ชัน
งูใหญ่เราจะใช้ซ็อกเก็ต () ฟังก์ชั่นในการสร้างซ็อกเก็ต, ไวยากรณ์เป็นดังนี้:
socket.socket([family[, type[, proto]]])
พารามิเตอร์
- ครอบครัว: ครอบครัวสามารถสร้างซ็อกเก็ตหรือ AF_INET AF_UNIX
- ประเภท: ประเภทซ็อกเก็ตสามารถเชื่อมต่อที่มุ่งเน้นหรือ connectionless เข้า
SOCK_STREAM
หรือSOCK_DGRAM
- โปรโตคอล: โดยทั่วไปไม่เต็มเริ่มต้นที่ศูนย์
วัตถุซ็อกเก็ต (built-in) วิธีการ
ฟังก์ชัน | ลักษณะ |
---|---|
ซ็อกเก็ตเซิร์ฟเวอร์ | |
s.bind () | ที่อยู่ผูก (โฮสต์พอร์ต) เพื่อซ็อกเก็ตที่ AF_INET ในรูปแบบของ tuple (โฮสต์พอร์ต) ระบุที่อยู่ |
s.listen () | เริ่ม TCP ฟัง ค้างที่ระบุไว้ก่อนที่จะปฏิเสธการเชื่อมต่อระบบปฏิบัติการที่สามารถระงับจำนวนสูงสุดของการเชื่อมต่อ ค่านี้เป็นอย่างน้อย 1 ใช้งานมากที่สุดที่สามารถตั้งค่า 5 |
s.accept () | ยอมรับ passive ของการเชื่อมต่อลูกค้า TCP (ปิดกั้น) รอการมาถึงของ |
ซ็อกเก็ตไคลเอนต์ | |
s.connect () | การเชื่อมต่อเซิร์ฟเวอร์การเริ่มต้นใช้งาน TCP socket.error อยู่ทั่วไปของรูปแบบของสิ่งอันดับ (ชื่อโฮสต์พอร์ต) ว่าข้อผิดพลาดการเชื่อมต่อข้อผิดพลาดจะถูกส่งกลับ |
s.connect_ex () | เชื่อมต่อ () รุ่นที่ขยายจากฟังก์ชั่นส่งกลับรหัสข้อผิดพลาดเมื่อมีข้อผิดพลาดแทนการขว้างปาข้อยกเว้น |
ฟังก์ชั่นซ็อกเก็ตวัตถุประสงค์สาธารณะ | |
s.recv () | รับข้อมูล TCP ข้อมูลที่ถูกส่งกลับเป็นสตริงระบุจำนวนเงินสูงสุดของข้อมูลที่จะได้รับ bufsize ให้ข้อมูลเพิ่มเติมเกี่ยวกับธงข้อความสามารถมักจะถูกละเลย |
s.send () | ส่งข้อมูล TCP ส่งสตริงข้อมูลเพื่อการเชื่อมต่อซ็อกเก็ต ค่าตอบแทนเป็นจำนวนไบต์ที่จะส่งตัวเลขนี้อาจจะน้อยกว่าสตริงไบต์ |
s.sendall () | ข้อมูล TCP ส่งเสร็จสมบูรณ์แล้วส่งข้อมูล TCP สมบูรณ์ มันจะส่งสตริงข้อมูลเพื่อการเชื่อมต่อซ็อกเก็ต แต่ก่อนที่จะกลับจะพยายามที่จะส่งข้อมูลทั้งหมด กลับประสบความสำเร็จไม่มีข้อยกเว้นความล้มเหลวที่จะถูกโยนทิ้ง |
s.recvform () | ได้รับข้อมูล UDP () คล้ายกับ recv แต่ค่าตอบแทนเป็น (ข้อมูลที่อยู่) ประเด็นข้อมูลที่เป็นสตริงที่มีข้อมูลที่ได้รับข้อมูลที่อยู่จะถูกส่งไปอยู่ซ็อกเก็ต |
s.sendto () | ส่งข้อมูล UDP, ส่งข้อมูลไปยังซ็อกเก็ตที่อยู่ในรูปแบบของ (ipaddr พอร์ต) tuple ที่ระบุที่อยู่ห่างไกล ค่าตอบแทนเป็นจำนวนไบต์ที่ส่ง |
s.close () | ปิดซ็อกเก็ต |
s.getpeername () | ผลตอบแทนที่อยู่ระยะไกลเชื่อมต่อซ็อกเก็ต ค่าตอบแทนมักจะ tuple A (ipaddr พอร์ต) |
s.getsockname () | ผลตอบแทนที่ได้อยู่เองซ็อกเก็ตของ มักจะเป็น tuple (ipaddr พอร์ต) |
s.setsockopt (ระดับ optName ค่า) | กำหนดค่าของตัวเลือกซ็อกเก็ตที่กำหนด |
s.getsockopt (ระดับ optName [.buflen]) | ค่าตอบแทนของตัวเลือกซ็อกเก็ต |
s.settimeout (หมดเวลา) | ชุดซ็อกเก็ตเป็นเวลาการทำงานหมดเวลาหมดเวลาเป็นจำนวนจุดลอยตัวในไม่กี่วินาที ไม่มีค่าบ่งชี้ระยะเวลาที่ไม่มีเวลาออก โดยทั่วไปแล้วระยะเวลาการหมดเวลาก็ควรจะสร้างชุดซ็อกเก็ตเพราะพวกเขาอาจจะใช้ในการดำเนินการเชื่อมต่อ (เช่นการเชื่อมต่อ ()) |
s.gettimeout () | ส่งกลับค่าของระยะเวลาการหมดเวลาปัจจุบันในไม่กี่วินาทีถ้ามีระยะเวลาการหมดเวลาไม่มีการกำหนดผลตอบแทนไม่ |
s.fileno () | ผลตอบแทนที่ได้อธิบายไฟล์ซ็อกเก็ต |
s.setblocking (ธง) | ถ้าธงเป็น 0 ซ็อกเก็ตที่ถูกกำหนดเป็นโหมดที่ไม่ใช่การปิดกั้นมิฉะนั้นซ็อกเก็ตไปยังโหมดการปิดกั้น (ค่าเริ่มต้น) โหมด non-blocking ถ้าคุณโทร recv () ไม่พบข้อมูลใด ๆ หรือส่งโทร () ไม่สามารถส่งข้อมูลได้ทันทีก็จะทำให้เกิดข้อยกเว้น socket.error |
s.makefile () | สร้างเอกสารที่เกี่ยวข้องในการเชื่อมต่อกับซ็อกเก็ต |
ตัวอย่างง่ายๆ
เซิร์ฟเวอร์
เราใช้ฟังก์ชั่นซ็อกเก็ตโมดูลซ็อกเก็ตในการสร้างวัตถุซ็อกเก็ตวัตถุซ็อกเก็ตสามารถเรียกฟังก์ชั่นอื่น ๆ ที่จะตั้งค่าบริการซ็อกเก็ต
ตอนนี้เราสามารถระบุบริการโดยการเรียกผูก (ชื่อโฮสต์พอร์ต)พอร์ตฟังก์ชั่น (พอร์ต)
ต่อไปเราเรียกวิธีการยอมรับของวัตถุซ็อกเก็ตวิธีการรอการเชื่อมต่อลูกค้าและกลับวัตถุการเชื่อมต่อที่แสดงถึงการเชื่อมต่อไปยังลูกค้า
รหัสที่สมบูรณ์จะเป็นดังนี้:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 文件名:server.py import socket # 导入 socket 模块 s = socket.socket() # 创建 socket 对象 host = socket.gethostname() # 获取本地主机名 port = 12345 # 设置端口 s.bind((host, port)) # 绑定端口 s.listen(5) # 等待客户端连接 while True: c, addr = s.accept() # 建立客户端连接。 print '连接地址:', addr c.send('欢迎访问本教程!') c.close() # 关闭连接
ไคลเอนต์
ต่อไปเราเขียนเป็นลูกค้าที่ง่ายในการเชื่อมต่อกับอินสแตนซ์บริการที่สร้างขึ้นดังกล่าวข้างต้น หมายเลขพอร์ตคือ 12345
socket.connect (hosname พอร์ต) วิธีการเปิดการเชื่อมต่อ TCP ไปยังโฮสต์สำหรับพอร์ตชื่อโฮสต์ผู้ให้บริการท่าเรือเมื่อเชื่อมต่อแล้วเราสามารถโพสต์ข้อมูลจากเซิร์ฟเวอร์จำหลังจากเสร็จสิ้นการดำเนินการจะต้องมีการปิดการเชื่อมต่อ
รหัสที่สมบูรณ์จะเป็นดังนี้:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 文件名:client.py import socket # 导入 socket 模块 s = socket.socket() # 创建 socket 对象 host = socket.gethostname() # 获取本地主机名 port = 12345 # 设置端口好 s.connect((host, port)) print s.recv(1024) s.close()
ตอนนี้เราได้มีการเปิด terminal, ขั้วครั้งแรกที่ดำเนินการไฟล์ server.py:
$ python server.py
ขั้วที่สองดำเนินไฟล์ client.py:
$ python client.py 欢迎访问本教程!
นี่เป็นครั้งแรกของเราและจากนั้นเปิดสถานีคุณจะเห็นข้อมูลต่อไปนี้คือการส่งออก:
连接地址: ('192.168.0.118', 62461)
โมดูลหลามอินเทอร์เน็ต
นี่คือบางส่วนเขียนโปรแกรมเครือข่ายโมดูลหลามสำคัญ:
ข้อตกลง | ฟังก์ชั่นที่มีประโยชน์ | หมายเลขพอร์ต | โมดูลหลาม |
---|---|---|---|
HTTP | การเข้าถึงเว็บ | 80 | httplib, urllib, xmlrpclib |
NNTP | การอ่านและการโพสต์บทความข่าวที่เรียกว่า "โพสต์" | 119 | nntplib |
FTP | การถ่ายโอนไฟล์ | 20 | ftplib, urllib |
SMTP | ส่ง Email | 25 | smtplib |
POP3 | ได้รับจดหมาย | 110 | poplib |
IMAP4 | ได้รับจดหมาย | 143 | imaplib |
Telnet | บรรทัดคำสั่ง | 23 | telnetlib |
หนูขนาดใหญ่ | ค้นหาข้อมูล | 70 | gopherlib, urllib |
รายละเอียดเพิ่มเติมสามารถพบได้ในเว็บไซต์อย่างเป็นทางการของ งูหลามห้องสมุดซ็อกเก็ตและโมดูล