今天不算忙,難得有時間閒下來瞭解一下socket的通信機制原理,順便寫一個簡單的案例,以方便後期學習,積累。
一、服務端綁定一個端口號、並處於監聽狀態。用accept()接收發來的數據請求:
二、客戶端通過地址和端口號連接服務端,併發送數據請求。
三、服務端收到後,處理請求,併發請求發給客戶端。如何客戶端還在連接請求,那麼就循環操作。
四、客戶端處理完數據之後,發送關閉請求,服務端收到請求後也開始關閉連接。
以上簡介來自51cto博友分享
服務端代碼
server_m.py
#!/usr/bin/env python
#-*-coding:utf-8-*-
import SocketServer
class myMonitorHandler(SocketServer.BaseRequestHandler):
def handle(self):
recv_data = self.request.recv(1024) ##定義接收到的數據大小
print "From 客戶端 %s : %s" % (self.client_address,recv_data)
if __name__ == "__main__":
host,port = '',5000 #接收來自任意客戶端IP,指定port爲5000的數據
server = SocketServer.ThreadingTCPServer((host,port),myMonitorHandler)
server.serve_forever()
~
客戶端代碼
client_m.py
import socket
name = socket.gethostname() #隨意定義,這裏爲獲取本機主機名
host, port = "192.168.101.52",5000 #指定server ip和port 推送數據
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #指定傳輸的數據類型和結構。
s.connect((host,port)) #鏈接以上指定的主機端口
s.sendall(name) #將獲取到的變量name值傳送到服務端
s.close() #關閉請求鏈接
~
測試:
先啓動服務器端#python m_server.py
後啓動客戶端#python m_client.py
備註:如果先啓動客戶端,客戶端鏈接不到服務端會拋出異常
socket.error: [Errno 111] Connection refused
test result:
可以任意將變量name作爲一個變量參數傳入 比如命令 df -h free -m 等等