前面用sock模块写的服务端和客户端,存在一个大问题,就是当运行多个客户端的时候,必须等一个客户端运行结束,另一个客户端才能实现与服务端的交流,这显然不符合现实中的需求。有没有什么办法解决这个问题呢?有人说没有,屁话。当然有,这就需要用到一个sockserver的模块,用定义类继承类的方式来完成编程,上代码:
服务端:
#导入sockserver模块
import socketserverip_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:continueif msg=='quit':breaksocket_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就会通过轮询在不同任务间来回切换,你之所以觉察不到,是因为速度太快了。
同步:假设有A和B两个任务在运行,先执行A,当A遇到IO阻塞,B就等着A。等A彻底执行完了才会执行B。--效率低
异步:假设有A和B两个任务在运行,先执行A,当A遇到IO阻塞,先执行B,等回过头来再执行A,保持CPU始终处于工作状态。--效率高