Pengaturcaraan rangkaian Python


Python menyediakan dua tahap akses kepada perkhidmatan rangkaian. :

  • Perkhidmatan rangkaian peringkat rendah menyokong Soket asas, yang menyediakan API Soket BSD standard dan boleh mengakses semua kaedah antara muka Soket sistem pengendalian asas.

  • Modul perkhidmatan rangkaian peringkat tinggi SocketServer, yang menyediakan kelas pusat pelayan untuk memudahkan pembangunan pelayan rangkaian.


Apakah itu Soket?

Soket juga dipanggil "soket". Aplikasi biasanya membuat permintaan atau bertindak balas kepada rangkaian melalui Permintaan "soket" membolehkan komunikasi antara hos atau antara proses pada komputer.


fungsi socket()

Dalam Python, kami menggunakan fungsi socket() untuk mencipta soket Format sintaks adalah seperti berikut:

socket.socket([family[, type[, proto]]])

Parameter<. 🎜>

  • keluarga: Keluarga soket boleh menjadi AF_UNIX atau AF_INET

  • jenis: Jenis soket boleh dibahagikan kepada berorientasikan sambungan atau bukan sambungan

    atau SOCK_STREAMSOCK_DGRAM

  • protokol: Biasanya dibiarkan tidak diisi, lalainya ialah 0.

Kaedah objek soket (terbina dalam)

FungsiPenerangan
Soket sisi pelayan
s.bind()Ikat alamat (hos,port) ke soket, dalam AF_INET Di bawah, alamat dinyatakan dalam bentuk tuple (hos, port).
s.listen()Mulakan mendengar TCP. Tunggakan menentukan bilangan maksimum sambungan yang boleh ditangguhkan oleh sistem pengendalian sebelum menolak sambungan. Nilai ini mestilah sekurang-kurangnya 1, dan 5 adalah baik untuk kebanyakan aplikasi.
s.accept() Terima sambungan klien TCP secara pasif, (menyekat) menunggu ketibaan sambungan
Soket pelanggan
s.connect() secara aktif memulakan sambungan pelayan TCP. Secara amnya, format alamat ialah tuple (nama hos, port). Jika ralat sambungan berlaku, ralat socket.error dikembalikan.
s.connect_ex()Versi lanjutan fungsi connect(), yang mengembalikan kod ralat apabila ralat berlaku dan bukannya membuang pengecualian
Fungsi soket tujuan awam
s.recv()Menerima data TCP, data dikembalikan dalam bentuk rentetan, bufsize menentukan jumlah maksimum data. flag memberikan maklumat tambahan tentang mesej dan biasanya boleh diabaikan.
s.send()Hantar data TCP, menghantar data dalam rentetan ke soket yang disambungkan. Nilai pulangan ialah bilangan bait untuk dihantar, yang mungkin kurang daripada saiz bait rentetan.
s.sendall()Hantar data TCP sepenuhnya, hantar data TCP sepenuhnya. Menghantar data dalam rentetan ke soket yang disambungkan, tetapi cuba menghantar semua data sebelum kembali. Mengembalikan Tiada pada kejayaan, membuang pengecualian pada kegagalan.
s.recvform()Menerima data UDP, serupa dengan recv(), tetapi nilai pulangannya ialah (data, alamat). Di mana data ialah rentetan yang mengandungi data yang diterima, dan alamat ialah alamat soket yang menghantar data.
s.sendto()Hantar data UDP ke soket, alamat ialah tuple borang (ipaddr, port), menyatakan alamat jauh. Nilai pulangan ialah bilangan bait yang dihantar.
s.close()Tutup soket
s.getpeername() Kembali alamat jauh soket sambungan. Nilai pulangan biasanya tuple (ipaddr, port).
s.getsockname()Mengembalikan alamat soket itu sendiri. Lazimnya satu tuple (ipaddr,port)
s.setsockopt(level,optname,value)Tetapkan nilai pilihan soket yang diberikan.
s.getsockopt(level,optname[.buflen])Mengembalikan nilai pilihan soket.
s.settimeout(timeout)Menetapkan tempoh tamat masa untuk operasi soket ialah nombor titik terapung dalam saat. Nilai Tiada bermakna tiada tempoh tamat masa. Umumnya, tamat masa hendaklah ditetapkan apabila soket mula-mula dibuat, kerana ia boleh digunakan untuk operasi sambungan (seperti connect())
s.gettimeout()Mengembalikan nilai tempoh tamat masa semasa dalam saat, atau Tiada jika tiada tempoh tamat masa ditetapkan.
s.fileno()Mengembalikan deskriptor fail soket.
s.setblocking(flag)Jika bendera ialah 0, tetapkan soket kepada mod tidak menyekat, jika tidak tetapkan soket kepada mod menyekat ( nilai lalai). Dalam mod tidak menyekat, jika tiada data ditemui dengan memanggil recv(), atau panggilan send() tidak boleh menghantar data serta-merta, pengecualian socket.error akan berlaku.
s.makefile()Mencipta fail yang dikaitkan dengan soket

Contoh Mudah

Pelayan

Kami menggunakan fungsi soket modul soket untuk mencipta objek soket. Objek soket boleh menyediakan perkhidmatan soket dengan memanggil fungsi lain.

Kini kita boleh menentukan port(port) perkhidmatan dengan memanggil fungsi bind(hostname, port).

Seterusnya, kami memanggil kaedah terima objek soket. Kaedah ini menunggu sambungan pelanggan dan mengembalikan objek sambungan, menunjukkan bahawa ia disambungkan kepada klien.

Kod lengkap adalah seperti berikut:

#!/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('欢迎访问php中文网!')
    c.close()                # 关闭连接

Pelanggan

Seterusnya kami menulis contoh klien mudah untuk menyambung ke perkhidmatan yang dibuat di atas. Nombor port ialah 12345. Kaedah

socket.connect(nama hos, port) membuka sambungan TCP kepada pembekal perkhidmatan dengan hos nama hos dan port port. Selepas menyambung, kami boleh menghantar data dari pelayan Ingat, sambungan perlu ditutup selepas operasi selesai.

Kod lengkap adalah seperti berikut:

#!/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()

Sekarang kami membuka dua terminal, dan terminal pertama melaksanakan fail server.py:

$ python server.py

Terminal kedua melaksanakan klien Fail .py :

$ python client.py 
欢迎访问php中文网!

Ini adalah terminal pertama yang kami buka semula, dan anda akan melihat output maklumat berikut:

连接地址: ('192.168.0.118', 62461)

Modul Internet Python

Yang berikut disenaraikan Beberapa modul penting pengaturcaraan rangkaian Python:

ProtokolPenggunaan fungsiNombor portModul Python
协议功能用处端口号Python 模块
HTTP网页访问80httplib, urllib, xmlrpclib
NNTP阅读和张贴新闻文章,俗称为"帖子"119nntplib
FTP文件传输20ftplib, urllib
SMTP发送邮件25smtplib
POP3接收邮件110poplib
IMAP4获取邮件143imaplib
Telnet命令行23telnetlib
Gopher信息查找70gopherlib, urllib

HTTP
<🎜>Akses web<🎜><🎜>80<🎜><🎜>httplib, urllib, xmlrpclib<🎜><🎜><🎜><🎜>NNTP<🎜><🎜>Baca dan siarkan berita artikel, Biasanya dikenali sebagai "siaran"<🎜><🎜>119<🎜><🎜>nntplib<🎜><🎜><🎜><🎜>FTP<🎜><🎜>Pemindahan Fail<🎜><🎜>20 <🎜> <🎜>ftplib, urllib<🎜><🎜><🎜><🎜>SMTP<🎜><🎜>Hantar mel<🎜><🎜>25<🎜><🎜>smtplib<🎜><🎜> <🎜> <🎜>POP3<🎜><🎜>Terima mel<🎜><🎜>110<🎜><🎜>poplib<🎜><🎜><🎜><🎜>IMAP4<🎜><🎜>Dapatkan mel <🎜> <🎜>143<🎜><🎜>imaplib<🎜><🎜><🎜><🎜>Telnet<🎜><🎜>Barisan arahan<🎜><🎜>23<🎜><🎜>telnetlib< 🎜>< 🎜><🎜><🎜>Gopher<🎜><🎜>Pencarian maklumat<🎜><🎜>70<🎜><🎜>gopherlib, urllib<🎜><🎜><🎜><🎜><🎜 >Lagi Untuk maklumat lanjut, sila rujuk Perpustakaan dan Modul Soket Python di laman web rasmi. <🎜><🎜>