python網絡編程學習初步

1、套接字python

套接字是爲特定網絡協議(例如TCP/IP,ICMP/IP,UDP/IP等)套件對上的網絡應用程序提供者提供當前可移植標準的對象。它們容許程序接受並進行鏈接,如發送和接受數據。爲了創建通訊通道,網絡通訊的每一個端點擁有一個套接字對象極爲重要。windows

套接字爲BSD UNIX系統核心的一部分,並且他們也被許多其餘相似UNIX的操做系統包括Linux所採納。許多非BSD UNIX系統(如ms-dos,windows,os/2,mac os及大部分主機環境)都以庫形式提供對套接字的支持。服務器

三種最流行的套接字類型是:stream,datagram和raw。stream和datagram套接字能夠直接與TCP協議進行接口,而raw套接字則接口到IP協議。但套接字並不限於TCP/IP。網絡

2、套接字模塊socket

套接字模塊是一個很是簡單的基於對象的接口,它提供對低層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套接字)。spa

第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方法來關閉鏈接。

 

3、一個簡單的服務器和客戶端通訊的例子

服務器:

 

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()
相關文章
相關標籤/搜索