一、套接字
套接字是為特定網路協議(例如tcp/ip,icmp/ip,udp/ip等)套件對上的網路應用程式提供者提供當前可移植標準的物件。它們允許程式接受並進行連線,如傳送和接受資料。為了建立通訊通道,網路通訊的每個端點擁有乙個套接字物件極為重要。
套接字為bsd unix系統核心的一部分,而且他們也被許多其他類似unix的作業系統包括linux所採納。許多非bsd unix系統(如ms-dos,windows,os/2,mac os及大部分主機環境)都以庫形式提供對套接字的支援。
三種最流行的套接字型別是:stream,datagram和raw。stream和datagram套接字可以直接與tcp協議進行介面,而raw套接字則介面到ip協議。但套接字並不限於tcp/ip。
二、套接字模組
套接字模組是乙個非常簡單的基於物件的介面,它提供對低層bsd套接字樣式網路的訪問。使用該模組可以實現客戶機和伺服器套接字。要在python 中建立具有tcp和流套接字的簡單伺服器,需要使用socket模組。利用該模組包含的函式和類定義,可生成通過網路通訊的程式。一般來說,建立伺服器連線需要六個步驟。
1)建立socket物件。呼叫socket建構函式。
socket = socket.socket(familly,type)
family的值可以是af_unix(unix域,用於同一臺機器上的程序間通訊),也可以是af_inet(對於ipv4協議的tcp和 udp),至於type引數,sock_stream(流套接字)或者 sock_dgram(資料報文套接字),sock_raw(raw套接字)。
2)將socket繫結(指派)到指定位址上
socket.bind(address)
address必須是乙個雙元素元組,((host,port)),主機名或者ip位址+埠號。如果埠號正在被使用或者保留,或者主機名或ip位址錯誤,則引發socke.error異常。
3)繫結後,必須準備好套接字,以便接受連線請求。
socket.listen(backlog)
backlog指定了最多連線數,至少為1,接到連線請求後,這些請求必須排隊,如果佇列已滿,則拒絕請求。
4)伺服器套接字通過socket的accept方法等待客戶請求乙個連線:
connection,address = socket.accept()
呼叫accept方法時,socket會進入'waiting'(或阻塞)狀態。客戶請求連線時,方法建立連線並返回伺服器。accept方法返回乙個含有倆個元素的元組,形如(connection,address)。第乙個元素(connection)是新的socket物件,伺服器通過它與客戶通訊;第二個元素(address)是客戶的internet位址。
5)處理階段,伺服器和客戶通過send和recv方法通訊(傳輸資料)。
send / recv
伺服器呼叫send,並採用字串形式向客戶傳送資訊。send方法返回已傳送的字元個數。
伺服器使用recv,從客戶接受資訊。呼叫recv時,必須指定乙個整數來控制本次呼叫所接受的最大資料量。
recv方法在接受資料時會進入'blocket'狀態,最後返回乙個字串,用它來表示收到的資料。如果傳送的量超過recv所允許,資料會被截斷。多餘的資料將緩衝於接受端。以後呼叫recv時,多餘的資料會從緩衝區刪除。
6)傳輸結束,伺服器呼叫socket的close方法以關閉連線。
close
建立乙個簡單客戶連線則需要4個步驟。
第1步,建立乙個socket以連線伺服器 socket=socket.socket(family,type)
第2步,使用socket的connect方法連線伺服器 socket.connect((host,port))
第3步,客戶和伺服器通過send和recv方法通訊。
第4步,結束後,客戶通過呼叫socket的close方法來關閉連線。
三、簡單例子
伺服器:
import
sockets=
socket.socket()
s.bind((
'***.***.***.***
',***x))
#ip位址和埠號
s.listen(5 )
cs,address
= s.accept()
'got connected from
' ,address
cs.send(
'byebye' )
ra=cs.recv(
512 )
racs.close()
客戶端:
import
sockets=
socket.socket()
s.connect((
'***.***.***.***
',***x))
#與伺服器程式ip位址和埠號相同
data
=s.recv(
512 )
s.send(
'hihi' )
s.close()
'the data received is
',data
執行:在本機測試(windows環境下,可以將ip位址改為本機ip,埠號在1024以上,windows將1024以下的為保留),執行--cmd--進入命令列模式
先python 伺服器程式,後python 客戶端程式即可。
或者啟動伺服器程式後,用telnet ip位址 埠號,也可以得到同樣結果。
讓server持續接受連線
server.py
import
sockets=
socket.socket()
s.bind((
'192.168.43.137',
2000
))s.listen(5 )
while1 :
cs,address
= s.accept()
'got connected from
' ,address
cs.send(
'hello i am server,welcome' )
ra=cs.recv(
512 )
racs.close()
測試兩個乙個程式中兩個socket並存是否可行
client.py
import
sockets=
socket.socket()
s.connect((
'192.168.43.137',
2000
))
data
=s.recv(
512 )
'the data received is\n
' ,data
s.send(
'hihi i am client' )
sock2
= socket.socket()
sock2.connect((
'192.168.43.137',
2000
))data2
=sock2.recv(
512 )
'the data received from server is\n
' ,data2
sock2.send(
'client send use sock2' )
sock2.close()
s.close()
python程式設計初步 Python程式設計學習初步
python控制語句 1 選擇語句 if 最簡單的二選一,if後跟布林表示式,為true,執行true下的語句,為fail,執行fail下的語句 if booleanexpression suite of python statement rest of the python program 基本的...
網路程式設計初步認識(一)
1 socket是連線應用程式與網路驅動程式的橋梁,socket在應用程式中建立,通過繫結操作與驅動程式建立關係。應用程式送給socket的資料,由socket交給驅動程式,驅動程式向網路傳送出去。計算機從網路上收到與該socket繫結的ip位址和埠號相關的資料後,由驅動程式交給socket,應用程...
Python程式設計學習初步
python控制語句 1 選擇語句 if 最簡單的二選一,if後跟布林表示式,為true,執行true下的語句,為fail,執行fail下的語句 if booleanexpression suite of python statement rest of the python program 基本的...