【Python之旅】第五篇(一):Python Socket通訊原理

    只要和網絡服務涉及的,就離不開Socket以及Socket編程,下面就說說Python Socket通訊的基本原理。
python


1.Socket編程

    socket也稱做「套接字」,用於描述IP地址和端口,是一個通訊鏈的句柄。應用程序一般經過「套接字」向網絡發出請求或者應答網絡請求。能夠列舉中國移動或者是中國電信等的電話客服,固然,也能夠看下面的圖片來做形象的說明。
服務器

    socket起源於Unix,而Unix/Linux基本哲學之一就是:一切皆文件,即均可以用「打開open—>讀寫write/read—>關閉close」模式來操做。Socket就是該模式的一個實現,socket便是一種特殊的文件,一些socket函數就是對其進行的操做(讀/寫IO、打開、關閉)。
網絡

    能夠看下面的圖示來形象說明:
socket

wKioL1YPYV-ASBXxAAG4ZzVVxxg286.jpg

2.Socket編程ide

(1)Socket服務器編程函數

    主要包括下面的幾步:spa

1.打開socket線程

2.綁定到一個地址和端口orm

3.偵聽進來的鏈接

4.接受鏈接

5.讀寫數據


(2)Socket客戶端編程

    主要包括下面的幾步:

1.打開socket

2.鏈接到一個地址和端口

3.讀寫數據


3.Socket類型

    Socket從類型上分,能夠有如下幾種:

socket類型 適用範圍 說明
socket.AF_UNIX 只可以用於單一的Unix系統進程間通訊 不能在不一樣主機之間通訊
socket.AF_INET 服務器之間網絡通訊 目前經常使用的就是這種
socket.AF_INET6 IPv6 因爲IPv6未推廣,也少用

    上面是socket的類型,細分的話還有socket的數據包類型,圖示以下:

wKiom1YPZeHgW_wqAAHUjUnzsUk309.jpg

    經常使用的是第一種和第二種,即for TCP和for UDP的類型,固然socket.SOCK_RAW也須要注意,由於它能夠構造IP頭,所以沿着這個思路,能夠合僞造不一樣源IP地址的數據包,以對一些中小型企業服務器發動Dos***。


4.Socket函數

    對socket進行相關操做如「讀/寫IO、打開、關閉」的函數便是Socket函數,能夠看下面的圖示:

wKioL1YPZkWQ7j2kAAKpXDeEktM173.jpgwKiom1YPZlnxRJORAACWrVeJL3E983.jpg

wKiom1YPZoLBYyhJAAIovv5QHqs076.jpgwKiom1YPZp-AtJwoAAIlQjSur0Y883.jpg    只須要記住經常使用的就能夠,即一般會在Server端和Client端中編程會用到的,能夠見下面的例子。


5.Socket例子

    下面就寫一個單線程非交互式的socket,在本機裏實現通訊就行了。

Server端:

import socket                #導入socket類

HOST =''                     #定義偵聽本地地址口(多個IP地址狀況下),這裏表示偵聽全部,也能夠寫成0.0.0.0
PORT = 50007                 #Server端開放的服務端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    #選擇Socket類型和Socket數據包類型
s.bind((HOST, PORT))         #綁定IP地址和端口
s.listen(1)                  #定義偵聽數開始偵聽(實際上並無效果)
conn, addr = s.accept()      #定義實例,accept()函數的返回值能夠看上面的socket函數說明

print 'Connected by', addr
while 1:
	data = conn.recv(1024)    #接受套接字的數據
	if not data:break         #若是沒有數據接收,則斷開鏈接
	print 'revc:',data        #發送接收到的數據
	conn.sendall(data)        #發送接收到的數據
conn.close()                      #關閉套接字


Client端:

import socket

HOST = '192.168.1.13'        #定義目標主機名
PORT = 50007                 #定義目標主機開放服務端口號
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #選擇Socket類型和Socket數據包類型 
s.connect((HOST, PORT))      #鏈接到目標主機的socket(套接字)中

s.sendall('Hello, world!')   #發送數據
data = s.recv(1024)          #接收數據
s.close()                    #關閉socket
print 'Received', repr(data)


演示:

步驟1:Server端運行服務端程序

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python server4.py 
===>光標在此到處於等待狀態

步驟2:Client端運行客戶端程序

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py 
Received 'Hello, world!    ===>收到服務端返回的數據

步驟3:在Server端中觀察現象

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python server4.py 
Connected by ('192.168.1.13', 52641)    ===>有客戶端鏈接進來,52641爲Client的隨機端口號
revc: Hello, world!                     ===>收到來自Client端的數據
相關文章
相關標籤/搜索