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()