在我们正常的使用socket模块来写一个server的程序就会显得比较的复杂通常一般流程为
1.生成socket实例对象
2.绑定地址
3.开始监听
4.接收数据
一般demo为
# 服务器 import socket server = socket.socket() # 声明socket类型,同时生成socket连接对象 server.bind(('localhost', 6969)) # 绑定要监听的端口此时绑定的是本地 server.listen() # 监听 括号里面的就是最大允许链接 print('等待电话打进来') coon, addr = server.accept() # 等待 (此时上面加一个while 就可以多个电话打进来并且进行通话) # coon 就是客户端连过来而在服务器端为其生成的一个连接实例 # addr 就是地址 print('电话打进来了') print(coon, addr) # 将coon 与addr 显示出来 while True: # 此时就可以一直不停的发送数据了, 此时的效果就是一个电话可以无阻碍的通话 # 如果此时没有true的话就只能接收一次了 data = coon.recv(1024) # 接收数据 print('recv:', data.decode()) # 此时注意我们需要吧接收的数据解码,因为发过来的是byte类型 coon.send(data.upper()) # 将数据里面的字母转化为大写发送 server.close()
这就是一个单个接入,多次接收的server
如果想用多个接入多个接收的话我们只需要在coon上加一个while即可 ,对与server来说一个coon就是哟个接入点
那么我们的socketserver又是方便在何处呢
对于socketserver来说我们只需要修改头节点就可以了
我们需要新建立一个类在类里面修改 socketserver . BaseRequestHandler即可
在这个类中hand结束即代表 当前连接断开
import socketserver class My_TCPhandler(socketserver.BaseRequestHandler): def handle(self): while True: try: self.data = self.request.recv(1024) print("{} wrote:".format(self.client_address[0])) print(self.data) self.request.send(self.data.upper()) # 服务器端到此结束 except ConnectionResetError as e: print(e) break HOST, POST = "localhost", 9999 server = socketserver.ThreadingTCPServer((HOST, POST), My_TCPhandler) # 并发 TCPServer改成 ThreadingTCPServer 在Linux是建议使用Forking来开多线程 server.serve_forever()
当
server = socketserver.ThreadingTCPServer((HOST, POST), My_TCPhandler) 时就是开了多线程可以多个接入,多个实时接收与发送
这样来看我们的的服务器端的程序是不是便捷了呢?