socket模組的主要目的是幫助在網路上的兩|個程式之間建立資訊通道。在python中提供了兩個基本的socket模組:服務端socket和客戶端socket。當建立了乙個服務端socket之後,這個socket就會在本機的乙個埠上等待連線,客戶端socket會訪問這個埠,當兩者完成連線之後,就可以進行互動了。在python中,socket 模組的使用十分簡單。在使用socket進行程式設計的時候,需要首先例項化乙個socket類,這個例項化需要三個引數:第乙個參 數是位址族,第二個引數是流,第三個引數是使用的協議。使用socket建立服務端的思路主要是首先例項化乙個socket類,然後開始迴圈監聽,直可以接收來自客戶端的連線。成功建立連線之後,接收客戶端發來的資料,並再向客戶端傳送資料,傳輸完畢之後,關閉這次連線。使用socket建立客戶端則要簡單得多,在例項化乙個socket類之後,連線乙個遠端的位址,這個位址由ip和埠組成。成功建立連線之後,開始傳送和接收資料,傳輸完畢之後,關閉這次連線。
socket例項化
首先看一下如何例項化乙個socket。socket例項化的格式為:
其中,三個引數中的family是要使用的位址族,以下是常用的協議族socket(family,
type
[,protocal]
)
協議族型別
af_inte
ipv4
af_inte6
ipv6
af_unix
本地af_route
路由第二個引數type用來指明socket型別,這裡可以使用一下引數
引數型別
作用sock_stream
tcp保證資料順序及可靠性
sock_dgram
udp不保證資料接收的順序,非可靠連線
sock_raw
原始型別
允許對底層協議如ip或icmp進行直接訪問
第三個引數是指使用的協議,這個引數是可選額,通常賦值「0」,由系統自動選擇。
如果希望初始化乙個tcp型別的socket,可以使用以下語句。
這條語句相當於socket.socket(socket.af_inet,socket.sock_stream)。這裡因為都是預設值,所以可以省略。s=socket.socket(
)
而如果想要初始化乙個udp型別的socket,則可以使用如下語句。
s=socket.socket(socket.af_inet,socket.sock_dgram)
socket類中主要提供如下所示常用的函式。
函式作用
bind()
將指定的ip與埠繫結起來,如果之前使用了af_inet初始化socket,那麼這裡可以使用元組(husi,port)的形式表示位址
listen()
指定服務端可以監聽的最大數量,這個引數最小為1,一般為5
accept()
用於在使用tcp的服務端接收連線,一般時阻塞態,接收tcp連線並返回(conn,address),其中,conn是新的套接字物件,可以用來接收和傳送資料;address是連線客戶端的位址
connect()
用於在使用tcp的客戶端去連線服務端,使用的引數是乙個元組,形式為(hostname,port)
send()
用於在使用tcp時傳送資料,完整的形式為send(steing[,flag]),利用這個函式可以將string代表的資料傳送到已經連線的socket,返回資訊傳送位元組數量。但是可能未將指定的內容全部傳送
recv()
用於使用tcp是接收資料,完整的形式為recv(bufsoze[,flag]),接收socket的資料,詩句以字串形式返回,bufsize指定最多可以接受的數量,flag這個引數一般不會使用
sendto()
用於udp傳送資料,完整的形式為sendto(string[,flag],address),返回值是傳送的位元組數。address是形式為(ipaddr.port)的元組,指定遠端位址
recvfrom()
udp專用,接收資料,返回遠端資料的ip位址和埠,但返回值是(data,address)。其中data是包含接收資料的字串,address是傳送資料的套接字位址
close()
關閉socket
- 服務端
- 客戶端import socket
s1 = socket.socket(
)#指定協議與傳輸型別
s1.bind(
("127.0.0.1"
,6666))
#繫結伺服器ip位址與埠
s1.listen(5)
#設定最大監聽數
while1:
("waiting a new connect..."
) conn,address = s1.accept(
)#等待tcp連線
("a new connect from:"
,address)
#輸出客戶端的資訊
conn.send(
"hey man~"
.encode(
"utf-8"))
#向客戶端傳送資訊
msg = conn.recv(
1024
)#等待接收客戶端資訊
("client:"
, msg)
#輸出客戶端資訊
conn.close(
)#斷開連線
服務端:import socket
s2 = socket.socket(
)#指定協議與傳輸型別
s2.connect(
("127.0.0.1"
,6666))
#與服務端建立連線
s2.send(
"hello man!"
.encode(
"utf-8"))
#傳送資訊
data = s2.recv(
1024
)#等待接收資訊
("server:"
,data)
#輸出接收到的資訊
s2.close(
)#斷開連線
客戶端:
執行之後可以看到乙個來自本機59885(這個數字代表客戶端使用的埠,每次都不一樣)的連線,這表明客戶端已經成功地與服務端建立了連線。socket可以算是使用頻率最高的網路模組檔案了,關於這個模組的應用,後面還會與其他模組結合起來進行詳細介紹。
Socket的Server Client模型的程式
開發原理 伺服器 使用socket監聽指定的埠 埠可以隨意指定,但是因為有的作業系統規定1024之前的埠規系統所用,所以我們還是給作業系統讓位,取大於1024的埠 等待客戶連線請求,客戶連線之後,伺服器與客戶端的會話產生,在完成會話之後,關閉連線。客戶端 使用socket對網路上某乙個伺服器的某一埠...
python怎麼取模 Python中的取模運算方法
所謂取模運算,就是計算兩個數相除之後的餘數,符號是 如a b就是計算a除以b的餘數。用數學語言來描述,就是如果存在整數n和m,其中0 m b,使得a n b m,那麼a b a n b m.取模運算的兩個運算元都必須是整數,可以是負整數,但是b不可以是0,因為被除數不能為0嘛。當a和b中存在負整數時...
Python中的numpy linalg模組
線性代數 numpy.linalg模組包含線性代數的函式。使用這個模組,可以計算逆矩陣 求特徵值 解線性方程組以及求解行列式等。import numpy as np 1.計算逆矩陣 建立矩陣 a np.mat 0 1 2 1 0 3 4 3 8 print a 0 1 2 1 0 3 4 3 8 使...