5.socketserver实现客户端和服务端保持通信

socket的缺陷:

使用socket编写使客户端和服务端连接时,只能由一个客户端能够与服务端保持连接,

其他的客户端只能处于排队状态,等待服务端与正在连接的客户端断开连接,下一个客户端才能连接

总之:同时只能由一个客户端能够与服务端保持连接,接收信息

socketserve

因此就可以使用socketserver来使那些服务器与客户端连接,同时可以由多个客户端连接,同时发送信息
因为是需要服务端有多线程的功能,只需要改写服务端代码即可,客户端的代码不需要发送变化,按照socket的逻辑写即可

代码流程:

流程
1,重写一个类,类要继承socketserver.BaseRequestHandler这个类
2,调用一个server类,把参数传到类中,实例化一个对象
3,对象调用server_forever方法进行数据接收
4,调用server_close关闭socket连接

代码格式:

服务端代码格式:

class Myserver(socketserver.BaseRequestHandler): #必须要继承该类
    def handle(self) :  #重写该类的handle方法,所有的逻辑操作都写在该方法里
        数据接收逻辑流程代码
        #在这里,con的获取方式发送变化,要使用con=self.request   #这句话的作用与con, adr = sk.accept()的作用相同
        self.client_address#是客户端的ip和进程号

if __name__ =='__main__':
    server=socketserver.ThreadingTCPServer(('127.0.01',8000),Myserver)  #该步骤设置端口和ip,完成所有的连接前绑定并连接,并创建多线程
    server.serve_forever()#调用handle方法进行数据接收

以下代码是服务端立即回传客户端发送的数据:

#####客户端代码,与socket代码相同
import socket
sk=socket.socket()
address=('127.0.0.1',8000)
sk.connect(address)
while 1:
    a=input(">>>")
    if a=='exit':
        break
    sk.send(a.encode('utf-8'))
    data=sk.recv(1024)
    print(data.decode('utf-8'))
sk.close()
#####服务端代码:
import socketserver
class Myserver(socketserver.BaseRequestHandler): #必须要继承该类
    def handle(self) :  #重写该类的handle方法,所有的逻辑操作都写在该方法里
        print('服务开启')
        while 1:
            con=self.request   #这句话的作用与con, adr = sk.accept()的作用相同
            print(self.client_address)
            while 1:
                client_data=con.recv(1024)
                print(client_data.decode('utf-8'))
                print('waiting...')
                con.sendall(client_data)
            con.close()

if __name__ =='__main__':
    server=socketserver.ThreadingTCPServer(('127.0.01',8000),Myserver)  #该步骤完成所有的连接前绑定
    server.serve_forever()

如下代码是使用socketsever来编写代码,完成多个客户端与一个服务端聊天的功能

执行后可服务端可连接多个用户端,实现同时发送信息,一对多聊天

#客户端代码
import
socket sk=socket.socket() address=('127.0.0.1',8000) sk.connect(address) while True: data=bytes(input('想跟美女说什么:'),encoding='utf-8') if data== bytes('exit',encoding='utf-8'): break sk.send(data) data=sk.recv(1024).decode('utf-8') print('美女:'+data) sk.close() print('聊天结束')
服务端代码:
import socketserver
class Myserver(socketserver.BaseRequestHandler): #必须要继承该类
    def handle(self) :  #重写该类的handle方法,所有的逻辑操作都写在该方法里
        print('服务开启')
        while 1:
            con=self.request   #这句话的作用与con, adr = sk.accept()的作用相同
            print(self.client_address)
            while 1:
                try:
                    data = con.recv(1024).decode('utf-8')
                except Exception:
                    print('客户端被强制结束')
                    break
                print('小虎:' + data)
                if not data:
                    break
                data = bytes(input('想跟小虎说什么:'), encoding='utf-8')
                con.send(data)
        con.close()

if __name__ =='__main__':
    server=socketserver.ThreadingTCPServer(('127.0.01',8000),Myserver)  #该步骤完成所有的连接前绑定
    server.serve_forever()

 

posted @ 2020-10-27 21:27  maday  阅读(665)  评论(0)    收藏  举报