xxglsvr.pysocket
#-*- coding:utf-8 -*-
from socketserver import ThreadingTCPServer, TCPServer, BaseRequestHandler
import tracebacktcp
class MyBaseRequestHandler(BaseRequestHandler):
def handle(self):
#循環監聽(讀取)來自客戶端的數據
while True:
try:
#一次讀取1024字節,並去除兩端的空白字符(包括空格,TAB,\r,\n)
data = self.request.recv(1024).strip()
data = data.decode()
if data == '':
break函數
#self.client_address是客戶端的鏈接(host, port)的元組
print("receive from %r: [%r]" % (self.client_address, data))
ret = self.exec_sub(data, data)
self.request.sendall(ret.encode())
except:
#traceback.print_exc() #當客戶端主動斷開鏈接時,self.recv(1024)會拋出異常
breakcode
#根據報文名稱調用對應的模塊,並傳遞參數,將執行結果返回給客戶端
def exec_sub(self, procName, params):
try:
loc = locals()
exec("from %s import call_sub" % procName)
call_sub = loc['call_sub']
result = call_sub(params)
return result
except Exception as e:
print(str(e))
return "error"server
if __name__ == "__main__":
host = "" #主機名,能夠是ip,像localhost的主機名,或""
port = 9999 #端口
addr = (host, port)
#server = TCPServer(addr, MyBaseRequestHandler)
server = ThreadingTCPServer(addr, MyBaseRequestHandler)
server.serve_forever()對象
---------------------------------------------------------------------------ip
xxglsvr01.pyutf-8
import sysget
def call_sub(params):
return "call xxglsvr01(%s)" % paramsio
---------------------------------------------------------------------------
xxglsvr02.py
import sys
def call_sub(params):
return "call xxglsvr02(%s)" % params
--------------------------------------------------------------------------
client1.py
import socket # 導入 socket 模塊
def main():
tcpClientSocket= socket.socket() # 建立 socket 對象
host = socket.gethostname() # 獲取本地主機名
port = 9999 # 設置端口好
tcpClientSocket.connect((host, port))
#該函數返回接收到的數據,數據均以字節表示,參數bufsize表示一次收到的最大的字節數
#使用這個方法好處是若是信號處理器未收到異常或系統請求中斷,會從新嘗試使系統從新請求而不是直接報錯
data = "xxglsvr01"
tcpClientSocket.sendall(data.encode())
data = tcpClientSocket.recv(1024).strip()
print(data.decode())
tcpClientSocket.close()
if __name__ == "__main__": main()