• UDP协议&socketserver模块


    一、UDP协议

    1.1 UDP实现简单通信

    服务器
    -------------------------------------------------------------
    import socket
    
    soc= socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #socket.SOCK_DGRAM是UDP协议
    
    soc.bind(('127.0.0.1',8080))   #绑定地址和端口号
    
    while True:  #通信循环
        data,addr = soc.recvfrom(1024)  #无需等待接收和监听
        print(data)
        soc.sendto(data.upper(),addr)  #将处理好的数据发送给客户端
    客户端
    ------------------------------------------------------------
    import socket
    
    soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #实例化一个对象
    
    while True: #通信循环
        msg= input('请输入数据>>>').strip()
    
        msg = msg.encode('utf8')  #将数据转化为bytes格式
    
        soc.sendto(msg,('127.0.0.1',8080))
    
        data = soc.recvfrom(1024)   #接收数据
    
        print(data[0]) #打印数

    1.2 UDP的特点

    • 可以发空内容(数据报协议,有数据头)
    • 不需要建连接(所以他不可靠)
    • 不回粘包
    • 不可靠(客户端,服务端谁断开都不影响发送消息)

    1.3 UDP与TCP的区别

    TCPUDP
    可靠连接 不可靠连接
    基于数据流的传输 基于数据报的传输
    粘包 不粘包
    不丢包 丢包

    二、socketserver模块


    可以实现并发编程,让多个客户端同时访问,服务器同时处理多个客户端发来的数据

    2.1 socketserver模块实现TCP简单通信

    服务端
    -----------------------------------------------------------------------------------
    import socketserver   #导入模块
    
    class MyTcp(socketserver.BaseRequestHandler):    #继承一个类,带有Base的都是基类
        def handle(self):  #必须重写handle方法
            try:
                while True:
                    #request其实就是之前conn对象
                    data = self.request.recv(1024)  #接收数据
                    if len(data)== 0:  #如果数据发的是空
                        return   #直接结束
                    self.request.send(data.upper())  #将数据变大写发送给客户端
    
            except Exception:
                pass
    
    if __name__ == '__main__':
        #实例化一个socketserver对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
        soc= socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTcp)  #第一个参数是绑定的地址,第二个参数是自定义的类
    
        soc.serve_forever()  #只要来一个客户端,我们就给他一个线程做交互
    客户端
    -----------------------------------------------------------------------------
    import socket  #客户端不需要用socketserver来实现
    soc = socket.socket()
    soc.connect(('127.0.0.1',8080))
    while True:
        msg = input('请输入数据>>>').strip()
        msg = msg.encode('utf8')
        data= soc.send(msg)
        print(soc.recv(1024))

    2.2 socketserver模块实现UDP简单通信

    服务器
    --------------------------------------------------------------------------------------
    import socketserver
    
    class MyUdp(socketserver.BaseRequestHandler):
        def handle(self):
            print(self.request[0])  #b'dfgh'
            #<socket.socket fd=544, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>
            print(self.request[1])
            print(type(self.request[1]))  #<class 'socket.socket'>
            data = self.request[0].decode('utf8')
            data = data.upper().encode('utf8')
            # self.request(tcp / udp是不一样的)
            self.request[1].sendto(data,self.client_address)  #self.client_address客户端地址
    
    if __name__ == '__main__':
        soc = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUdp)
        soc.serve_forever()
    客户端
    ---------------------------------------------------------------------------------------
    import socket
    
    soc = socket.socket(type = socket.SOCK_DGRAM)
    
    while True:
        msg = input('请输入数据>>>').strip()
        msg = msg.encode('utf8')
        soc.sendto(msg,('127.0.0.1',8080))
        data = soc.recvfrom(1024)   #他是bytes形式
        print(data[0].decode('utf-8'))  #转为str格式
     
  • 相关阅读:
    Vijos P1597 2的幂次方【进制+递归】
    NUC1100 Biorhythms【中国剩余定理】
    HDU1370 Biorhythms【中国剩余定理】
    NUC1090 Goldbach's Conjecture【哥德巴赫猜想 】
    NUC1305 哥德巴赫猜想
    剑指Offer——最小的K个数
    剑指Offer——数组中出现次数超过一半的数字
    剑指Offer——字符串的排列
    剑指Offer——二叉搜索树与双向链表
    剑指Offer——复杂链表的复制
  • 原文地址:https://www.cnblogs.com/lulingjie/p/11529045.html
Copyright © 2020-2023  润新知