• socketservice模块


    socketservice模块

    socketservice模块可以实现多客户端同时连接服务端

    1 基于TCP协议的模块使用

    客户端

    from socket import *
    
    client=socket(AF_INET,SOCK_STREAM)
    client.connect(('127.0.0.1',8889))
    
    while True:
        msg=input('请输入命令>>:').strip()
        if len(msg) == 0:continue
        client.send(msg.encode('utf-8'))
    
        res=client.recv(1024)
        print(res.decode('utf-8'))
    

    服务端

    import socketserver
    
    class MyRequestHandle(socketserver.BaseRequestHandler):
        def handle(self):
            # 如果tcp协议,self.request=>相当于socket里的conn
            print(self.client_address)
            while True:
                try:
                    msg = self.request.recv(1024)
                    if len(msg) == 0: break
                    self.request.send(msg.upper())
                except Exception:
                    break
            self.request.close()
    
    
    
    #  服务端应该做两件事
    # 第一件事:循环地从半连接池中取出链接请求与其建立双向链接,拿到链接对象
    s=socketserver.ThreadingTCPServer(('127.0.0.1',8889),MyRequestHandle)
    s.serve_forever()
    # 等同于
    # while True:
    #     conn,client_addr=server.accept()
    #     启动一个线程(conn,client_addr)
    
    # 第二件事:拿到链接对象,与其进行通信循环===>handle
    

    2 基于UDP协议的模块使用

    客户端

    import socket
    
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  
    
    while True:
        msg = input('>>>: ').strip()
        client.sendto(msg.encode('utf-8'), ("127.0.0.1", 8888))
        res = client.recvfrom(1024)
        print(res)
    
    client.close()
    

    服务端

    import socketserver
    
    class MyRequestHanlde(socketserver.BaseRequestHandler):
        def handle(self):
            # self.request为一个元组,第一个元素时接受到的数据,第二个元素是socket对象
            # 第二个元素:service
            # service = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  
            client_data=self.request[0]
            server=self.request[1]
            client_address=self.client_address
            print('客户端发来的数据%s' %client_data)
            server.sendto(client_data.upper(),client_address)
    
    
    s=socketserver.ThreadingUDPServer(("127.0.0.1",8888),MyRequestHanlde)
    s.serve_forever()
    # 相当于:只负责循环地收
    # while True:
    #     data,client_addr=server.recvfrom(1024)
    #     启动一个线程处理后续的事情(data,client_addr)
    

    3 总结

    基于tcp的socketserver我们自己定义的类中的

    1. self.server即套接字对象
    2. self.request即一个链接
    3. self.client_address即客户端地址

    基于udp的socketserver我们自己定义的类中的

    1. self.request是一个元组(第一个元素是客户端发来的数据,第二部分是服务端的udp套接字对象),如(b'adsf', )
    2. self.client_address即客户端地址
  • 相关阅读:
    十二月第二周学习进度条
    《UML大战需求分析》阅读笔记4
    十二月第一周学习进度条
    十一月第四周学习进度条
    十一月第三周学习进度条
    十一月第二周学习进度条
    制作验证码(转)
    阅读笔记04
    课堂作业-购书问题
    阅读笔记03
  • 原文地址:https://www.cnblogs.com/achai222/p/12745797.html
Copyright © 2020-2023  润新知