socketserver开发多线程服务器,计算器实例
什么是线程,什么是进程
在网络编程当中,比如web应用,但用户通过一个网址向服务器发送请求,那么服务器就会开辟出一个线程,来专门处理这个请求,就像开辟一条路,让信息这辆车通行。那么,什么是进程呢?可以简单理解其为线程的容器。
为什么要用多线程
为什么需要多线程呢?想想,如果有很多不同的客户端通过网址链接服务器并发送请求,那么一个线程,就像一条路有很多车要通行,就会出现拥堵的现象,因此就可以很大程度上地解决这个问题,而且同一个进程中的各个线程之间是共享该进程的内存和数据资源的。
python使用socketserver开发多线程服务器的步骤
上一节中,我们用python的socket编程简单地开发了一个基于TCP的服务器,很显然是一个单线程的,下面,我们可以通过socketserver这个包来创建多线程的服务器,其步骤如下:
- 在服务器端,导入import socketserver;
- 创建一个继承socketserver.BaseRequestHandler的类;
- 在创建的类中实现一个名称为handle的类实例方法;
- 将该类、服务器IP和端口,以参数的形式传递给ThreadingTCPServer()构造器;
- 启动ThreadingTCPServer。
socketserver多线程服务器实例
server.py服务器端
# -*- coding:utf-8 -*-
import socketserver
class xServer(socketserver.BaseRequestHandler):
def handle(self):
content = self.request #request封装了请求的所有数据
while True:
data = content.recv(1024).decode()
datalist = list(data)
f = datalist[1]
a = float(datalist[0])
b = float(datalist[2])
if f == '+':
result = a+b
elif f == '-':
result = a-b
elif f == '*':
result = a*b
else:
result = a/b
content.sendall(str(result).encode())
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',9961), xServer)
print("服务器已启动")
#socketserver.ThreadingTCPServer((ip, port), serverClass)用于创建多线程TCP服务器
server.serve_forever() #让服务器一直保持运行
client.py客户端
# -*- coding:utf-8 -*-
import socket
#注意要与server端的保持一致
#创建socket对象
sk = socket.socket()
#连接server端
print(sk)
sk.connect(('127.0.0.1', 9961))
while True:
data = input('计算:')
if data == '':
continue
data = data.encode() #发送之前要进行编码
sk.sendall(data)
recv_data = sk.recv(1024).decode()
if recv_data != '':
print('%s = %s'%(data,recv_data))
sk.close()
代码输出
服务器已启动
计算:1+1
b'1+1' = 2.0
计算:1/2
b'1/2' = 0.5
计算: