前面用sock模块写的服务端和客户端,存在一个大问题,就是当运行多个客户端的时候,必须等一个客户端运行结束,另一个客户端才能实现与服务端的交流,这显然不符合现实中的需求。有没有什么办法解决这个问题呢?有人说没有,屁话。当然有,这就需要用到一个sockserver的模块,用定义类继承类的方式来完成编程,上代码:
服务端:
#导入sockserver模块
import socketserver
ip_porf=('127.0.0.1',8080)
#自定义一个Myserver类,并继承基类
class Myserver(socketserver.BaseRequestHandler):
#改写基类的handle方法,固定写法,必须有这个。
def handle(self):
while True:
#接收来自客户端的消息
data=self.request.recv(1024)
#发送消息到客户端
self.request.sendall(data.upper())
if __name__ == '__main__':
s=socketserver.ThreadingTCPServer(ip_porf,Myserver)
print('服务端开始运行...')
s.serve_forever()
客户端:
from socket import *
ip_port=('127.0.0.1',8080)
#实例化一个sock的TCP协议的对象
socket_client=socket(AF_INET,SOCK_STREAM)
socket_client.connect(ip_port)
while True:
msg=input('---->:')
if not msg:continue
if msg=='quit':break
socket_client.sendall(msg.encode('utf-8'))
data=socket_client.recv(1024)
print('返回的结果是:%s' %data.decode('utf-8'))
socket_client.close()
按照上面的代码写法,就可以实现客户端并发,也就是说可以同时多个客户端访问服务端并与服务端数据交互。
科普下:并行和并发?同步和异步?
并行:多颗cpu同时执行多个任务
并发:一个或多颗cpu通过轮询切换任务的模式执行多项任务
其中,并行是并发的子集
是不是感觉一头雾水,那是因为你不了解计算机中cpu处理任务的逻辑,下面我来给你讲透彻。
假设你的电脑上只有一颗cpu,但是你听音乐的同时又想做PPT,实际上你的电脑的确可以做到这些。表面上看你的电脑似乎同时在做两件事,其实不是的,是cpu轮询切换的结果。
cpu工作同时存在两种机制(两种机制共同作用):
第一是当遇到IO阻塞,先去处理别的任务,如等待客户端输入信息。
第二是每隔很短的时间,cpu就会通过轮询在不同任务间来回切换,你之所以觉察不到,是因为速度太快了。
标签:socket,编程,并发,client,sockserver,cpu,服务端,客户端 From: https://www.cnblogs.com/kkbest/p/18366665同步:假设有A和B两个任务在运行,先执行A,当A遇到IO阻塞,B就等着A。等A彻底执行完了才会执行B。--效率低
异步:假设有A和B两个任务在运行,先执行A,当A遇到IO阻塞,先执行B,等回过头来再执行A,保持CPU始终处于工作状态。--效率高