Python 提供了兩個基本的 socket 模組
- Socket,它提供了標準的 BSD Sockets API。
- SocketServer,它提供了伺服器中心類,可以簡化網路伺服器的開發。
Socket 型別
套接字格式:
socket(family,type[,protocal]) 使用給定的地址族、套接字型別、協議編號(預設為0)來建立套接字。
Socket 函式
注意點:
- TCP傳送資料時,已建立好TCP連線,所以不需要指定地址。UDP是面向無連線,每次傳送要指定是發給誰。
- 服務端與客戶端不能直接傳送列表,元組,字典。需要字串化repr(data)。
Socekt程式設計思路
TCP服務端:
- 建立套接字,繫結套接字到本地IP與埠
socket.socket(socket.AF_INET,socket.SOCK_STREAM),s.bind() - 開始監聽連線
s.listen() - 進入迴圈,不斷接受客戶端的連線請求
s.accept() - 然後接收傳來的資料,併傳送給對方資料
s.recv() , s.sendall() - 傳輸完畢後,關閉套接字
s.close()
TCP客戶端:
- 建立套接字,連線遠端地址
socket.socket(socket.AF_INET,socket.SOCK_STREAM),s.connect() - 連線後傳送資料和接收資料
s.sendall(), s.recv() - 傳輸完畢後,關閉套接字
s.close()
服務端例項程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/usr/bin/python import socket # socket模組 import commands # 執行系統命令模組 HOST = '192.168.4.37' PORT = 50007 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 定義socket型別,網路通訊,TCP s.bind((HOST,PORT)) # 套接字繫結的IP與埠 s.listen(1) # 開始TCP監聽 while 1: conn,addr=s.accept() # 接受TCP連線,並返回新的套接字與IP地址 print'Connected by',addr # 輸出客戶端的IP地址 while 1: data=conn.recv(1024) # 把接收的資料例項化 cmd_status,cmd_result = commands.getstatusoutput(data) # commands.getstatusoutput執行系統命令(即shell命令),返回兩個結果,第一個是狀態,成功則為0,第二個是執行成功或失敗的輸出資訊 if len(cmd_result.strip()) ==0: # 如果輸出結果長度為0,則告訴客戶端完成。此用法針對於建立檔案或目錄,建立成功不會有輸出資訊 conn.sendall('Done.') else: conn.sendall(cmd_result) # 否則就把結果發給對端(即客戶端) conn.close() # 關閉連線 |
客戶端示例程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/usr/bin/python import socket HOST = '192.168.4.37' PORT = 50007 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 定義socket型別,網路通訊,TCP s.connect((HOST,PORT)) # 要連線的IP與埠 while 1: cmd=raw_input("Please input cmd:") # 與人互動,輸入命令 s.sendall(cmd) # 把命令傳送給對端 data=s.recv(1024) # 把接收的資料定義為變數 print data # 輸出變數 s.close() # 關閉連線 |