python中的Socket模組

2021-10-02 08:47:34 字數 3509 閱讀 3033

socket模組的主要目的是幫助在網路上的兩|個程式之間建立資訊通道。在python中提供了兩個基本的socket模組:服務端socket和客戶端socket。當建立了乙個服務端socket之後,這個socket就會在本機的乙個埠上等待連線,客戶端socket會訪問這個埠,當兩者完成連線之後,就可以進行互動了。在python中,socket 模組的使用十分簡單。在使用socket進行程式設計的時候,需要首先例項化乙個socket類,這個例項化需要三個引數:第乙個參 數是位址族,第二個引數是流,第三個引數是使用的協議。使用socket建立服務端的思路主要是首先例項化乙個socket類,然後開始迴圈監聽,直可以接收來自客戶端的連線。成功建立連線之後,接收客戶端發來的資料,並再向客戶端傳送資料,傳輸完畢之後,關閉這次連線。使用socket建立客戶端則要簡單得多,在例項化乙個socket類之後,連線乙個遠端的位址,這個位址由ip和埠組成。成功建立連線之後,開始傳送和接收資料,傳輸完畢之後,關閉這次連線。

socket例項化

首先看一下如何例項化乙個socket。socket例項化的格式為:

socket(family,

type

[,protocal]

)

其中,三個引數中的family是要使用的位址族,以下是常用的協議族

協議族型別

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,可以使用以下語句。

s=socket.socket(

)

這條語句相當於socket.socket(socket.af_inet,socket.sock_stream)。這裡因為都是預設值,所以可以省略。

而如果想要初始化乙個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:

print

("waiting a new connect..."

) conn,address = s1.accept(

)#等待tcp連線

print

("a new connect from:"

,address)

#輸出客戶端的資訊

conn.send(

"hey man~"

.encode(

"utf-8"))

#向客戶端傳送資訊

msg = conn.recv(

1024

)#等待接收客戶端資訊

print

("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

)#等待接收資訊

print

("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 使...