首頁 > 軟體

Python中的socket網路模組介紹

2022-07-22 22:01:26

前言:

Python3 提供了兩個級別存取的網路服務:

  • 低階別的網路服務支援基本的 Socket,它提供了標準的 BSD Sockets API,可以存取底層作業系統Socket介面的全部方法。
  • 高階別的網路服務模組 SocketServer, 它提供了伺服器中心類,可以簡化網路伺服器的開發。

Socket

Socket又稱"通訊端",應用程式通常通過"通訊端"向網路發出請求或者應答網路請求,使主機間或者一臺計算機上的程序間可以通訊。

Python 中,我們使用 socket 模組的 socket 函數來建立一個 socket 物件。語法格式如下:

socket.socket ( family ,type ,proto)

引數;

  • family: 通訊端家族可以使 AF_UNIX 或者 AF_INET
  • type: 通訊端型別,可以根據是面向連線的 SOCK_STREAM 還是非連線的 SOCK_DGRAM
  • protocol: 一般不填,預設為 0

伺服器端(server.py)

import socket

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立socket物件,面向連線的
server.bind(("127.0.0.1",9999)) #繫結主機名和埠號
server.listen(10) #設定最大連線數,超過後排隊
clientsock,addr=server.accept() #建立與使用者端的連線,返回(socket object, address info)元組物件
print("addr=%s %s"%(addr,type(addr)))
print("使用者端ip地址為:%s 埠號為:%s"%addr)
clientsock.send("歡迎來到伺服器端".encode('utf-8')) #python3要求傳送byte型的資料,所以我們將它以utf-8的形式轉換為bytes型別的
msg=clientsock.recv(1024) #接收使用者端發來的訊息,msg2為bytes型別的資料
print(msg.decode('utf-8')) #我們將bytes型別資料轉換成str字元型的資料,以utf-8的形式
clientsock.close()

使用者端(client.py)

import socket
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",9999)) #connect函數接收元組型資料
msg=client.recv(1024) #接收從伺服器發來的訊息,為bytes型別的資料,大小為1024位元組的緩衝區
print(msg.decode('utf-8')) #我們轉化為str字串型別的資料,以utf-8的形式
client.send("使用者端到此一遊".encode('utf-8')) #python3要求傳送bytes型別的資料,所以我們得將它轉換
client.close()

socket中的一些常用方法

import socket
a=socket.gethostname() #獲得本機的主機名,返回str型資料
print(a,type(a))
b=socket.gethostbyname(a) #根據主機名獲取ip地址,返回str型資料,也可以是網路上的域名
print(b,type(b))
c=socket.gethostbyaddr(b) #通過ip獲得該主機的一些資訊,返回tuple元組型資料
print(c,type(c))
#############################################
Win-10 <class 'str'>
192.168.56.1 <class 'str'>
('bogon', [], ['192.168.56.1']) <class 'tuple'>

Socket 物件(內建)方法

函數

描述

伺服器端通訊端

s.bind()

繫結地址(host,port)到通訊端, 在AF_INET下,以元組(host,port)的形式表示地址。

s.listen()

開始TCP監聽。backlog指定在拒絕連線之前,作業系統可以掛起的最大連線數量。該值至少為1,大部分應用程式設為5就可以了。

s.accept()

被動接受TCP使用者端連線,(阻塞式)等待連線的到來

使用者端通訊端

s.connect()

主動初始化TCP伺服器連線,。一般address的格式為元組(hostname,port),如果連線出錯,返回socket.error錯誤。

s.connect_ex()

connect()函數的擴充套件版本,出錯時返回出錯碼,而不是丟擲異常

公共用途的通訊端函數

s.recv()

接收TCP資料,資料以字串形式返回,bufsize指定要接收的最巨量資料量。flag提供有關訊息的其他資訊,通常可以忽略。

s.send()

傳送TCP資料,將string中的資料傳送到連線的通訊端。返回值是要傳送的位元組數量,該數量可能小於string的位元組大小。

s.sendall()

完整傳送TCP資料,完整傳送TCP資料。將string中的資料傳送到連線的通訊端,但在返回之前會嘗試傳送所有資料。成功返回None,失敗則丟擲異常。

s.recvfrom()

接收UDP資料,與recv()類似,但返回值是(data,address)。其中data是包含接收資料的字串,address是傳送資料的通訊端地址。

s.sendto()

傳送UDP資料,將資料傳送到通訊端,address是形式為(ipaddr,port)的元組,指定遠端地址。返回值是傳送的位元組數。

s.close()

關閉通訊端

s.getpeername()

返回連線通訊端的遠端地址。返回值通常是元組(ipaddr,port)。

s.getsockname()

返回通訊端自己的地址。通常是一個元組(ipaddr,port)

s.setsockopt(level,optname,value)

設定給定通訊端選項的值。

s.getsockopt(level,optname[.buflen])

返回通訊端選項的值。

s.settimeout(timeout)

設定通訊端操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時期。一般,超時期應該在剛建立通訊端時設定,因為它們可能用於連線的操作(如connect())

s.gettimeout()

返回當前超時期的值,單位是秒,如果沒有設定超時期,則返回None。

s.fileno()

返回通訊端的檔案描述符。

s.setblocking(flag)

如果flag為0,則將通訊端設為非阻塞模式,否則將通訊端設為阻塞模式(預設值)。非阻塞模式下,如果呼叫recv()沒有發現任何資料,或send()呼叫無法立即傳送資料,那麼將引起socket.error異常。

s.makefile()

建立一個與該通訊端相關連的檔案

Python Internet 模組

以下是 Python 網路程式設計的一些重要模組:

協定

功能用處

埠號

Python 模組

HTTP

網頁存取

80

httplib, urllib, xmlrpclib

NNTP

閱讀和張貼新聞文章,俗稱為"貼文"

119

nntplib

FTP

檔案傳輸

20

ftplib, urllib

SMTP

傳送郵件

25

smtplib

POP3

接收郵件

110

poplib

IMAP4

獲取郵件

143

imaplib

Telnet

命令列

23

telnetlib

Gopher

資訊查詢

70

gopherlib, urllib

到此這篇關於Python中的socket網路模組介紹的文章就介紹到這了,更多相關Python socket內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com