Python 提供了兩個級別訪問的網絡服務。
低級別的網絡服務支持基本的 Socket,它提供了標準的 BSD Sockets API,可以訪問底層操作系統Socket接口的全部方法。
高級別的網絡服務模塊 SocketServer, 它提供了服務器中心類,可以簡化網絡服務器的開發。
什么是 Socket?
Socket又稱”套接字”,應用程序通常通過”套接字”向網絡發出請求或者應答網絡請求,使主機間或者一臺計算機上的進程間可以通訊。
socket()函數
Python 中,我們用 socket()函數來創建套接字,語法格式如下:
socket.socket([family[, type[, proto]]])
參數
family: 套接字家族可以使AF_UNIX或者AF_INET
type: 套接字類型可以根據是面向連接的還是非連接分為SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默認為0.
socket實現服務端與客戶端的簡單通信(模擬ssh的部分功能以及自動應答)
server端的簡單程序示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#!/usr/bin/env python #coding:utf-8 ''' file:server.py date:9/8/17 3:43 PM author:lockey email:[email protected] desc:socket編程服務器端,python3.6.2 ''' import re import socket,time,os s = socket.socket() # 創建 socket 對象 host = '127.0.0.1' #socket.gethostname() # 獲取本地主機名 port = 9999 # 設置端口 s.bind((host, port)) # 綁定端口 s.listen( 5 ) # 等待客戶端連接 while True : conn, addr = s.accept() # 建立客戶端連接。 print ( 'conneted address:' .decode( 'utf-8' ), addr) #顯示連接到服務器的客戶端的地址 while True : data = conn.recv( 1024 ) #接收到的客戶端的請求或者返回 if not data: #當返回信息為空或者請求為空時斷開客戶端連接 print ( 'Connection closed!' ) break ; data = data.decode( 'utf-8' ) #以下前三個條件都是設置的自動檢測應答,最后一個是根據輸入的內容進行的命令執行,并將結果返回給客戶端 if re.findall(r 'who' ,data): reply = 'I am lockey' .encode( 'utf-8' ) elif re.findall(r 'gender' ,data): reply = 'A boy' .encode( 'utf-8' ) elif re.findall(r 'age' ,data): reply = '23' .encode( 'utf-8' ) else : print ( 'execute com:' ,data) cmd_res = os.popen(data).read() if not cmd_res: #對于命令的執行如果沒有返回值的話就給客戶端發送一條信息 conn.send( 'No response' .encode( 'utf-8' )) continue reply = cmd_res.encode( 'utf-8' ) conn.send(reply) #將結果發送給客戶端 |
client端的簡單實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#!/usr/bin/env python #coding:utf-8 ''' file:client.py date:9/8/17 3:43 PM author:lockey email:[email protected] desc:socket編程客戶端,python3.6.2 ''' import socket,time # 導入 socket 模塊 s = socket.socket() # 創建 socket 對象 host = '127.0.0.1' #socket.gethostname() # 獲取本地主機名 port = 9999 # 設置端口好 s.connect((host, port)) while True : cmd = input ( "lockey#" ) #用戶輸入 if len (cmd) = = 0 : continue #如果用戶未輸入內容則繼續下一次輸入 s.send(cmd.encode( 'utf-8' )) #將用戶輸入的內容發送給客戶端等待結果 result = s.recv( 1024 ) if not result: #如果服務端沒有返回結果則繼續下一次輸入 continue print (result.decode( 'utf-8' )) #如果服務端有返回則打印結果 s.close() #用戶終止程序時關閉連接 |
服務器端運行結果
客戶端運行截圖
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/Lockey23/article/details/77914222