重劍點評:
真簡單明了!複習網路編程,順便學習python。
一、通訊端
通訊端是為特定網路通訊協定(例如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,並採用字串形式向客戶發送資訊。send方法返回已發送的字元個數。伺服器使用recv方法從客戶接受資訊。調用recv時,必須指定一個整數來控制本次調用所接受的最大資料量。recv方法在接受資料時會進入'blocket'狀態,最後返回一個字串,用它來表示收到的資料。如果發送的量超過recv所允許,資料會被截斷。多餘的資料將緩衝於接受端。以後調用recv時,多餘的資料會從緩衝區刪除。
第6步,傳輸結束,伺服器調用socket的close方法以關閉串連。
建立一個簡單客戶串連則需要4個步驟。
第1步,建立一個socket以串連伺服器 socket=socket.socket(family,type)
第2步,使用socket的connect方法串連伺服器 socket.connect((host,port))
第3步,客戶和伺服器通過send和recv方法通訊。
第4步,結束後,客戶通過調用socket的close方法來關閉串連。
三、一個簡單的伺服器和用戶端通訊的例子
伺服器:
import socket
s=socket.socket()
s.bind(('xxx.xxx.xxx.xxx',xxxx)) #ip地址和連接埠號碼
s.listen(5)
cs,address = s.accept()
print 'got connected from',address
cs.send('byebye')
ra=cs.recv(512)
print ra
cs.close()
用戶端:
import socket
s=socket.socket()
s.connect(('xxx.xxx.xxx.xxx',xxxx)) #與伺服器程式ip地址和連接埠號碼相同
data=s.recv(512)
s.send('hihi')
s.close()
print 'the data received is',data
運行:
在本機測試(windows環境下,可以將ip地址改為本機ip,連接埠號碼在1024以上,windows將1024以下的為保留),運行--CMD--進入命令列模式
先python 伺服器程式,後python 用戶端程式即可。
或者啟動伺服器程式後,用telnet ip地址 連接埠號碼,也可以得到同樣結果。
讓server持續接受串連
server.py
import socket
s=socket.socket()
s.bind(('192.168.43.137',2000))
s.listen(5)
while 1:
cs,address = s.accept()
print 'got connected from',address
cs.send('hello I am server,welcome')
ra=cs.recv(512)
print ra
cs.close()
測試兩個一個程式中兩個socket並存是否可行
client.py
import socket
s=socket.socket()
s.connect(('192.168.43.137',2000))
data=s.recv(512)
print '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)
print 'the data received from server is/n ',data2
sock2.send('client send use sock2')
sock2.close()
s.close()
轉載聲明: 本文轉自 http://www.cppblog.com/lai3d/archive/2008/02/19/42919.html