在我们正常的使用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) 时就是开了多线程可以多个接入,多个实时接收与发送 这样来看我们的的服务器端的程序是不是便捷了呢?