• 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket


    基于UDP协议的套接字编程

    UDP套接字简单示例

    服务端

    import scoket
    
    server = socket.socket(socket.AF_INET, scoket.SOCK_DGRAM)  # 数据报协议-->UDP
    
    server.bind(('127.0.0.1', 8080))
    
    server.listen(5)
    
    while True:
        data, client_addr = server.recvfrom(1024)
        print(data, client_addr)
        
        server.sendto(data.upper(), client_addr)
    

    客户端

    import socket
    
    client = socket.socket(socket.AF_INET, scoket.SOCK_DGRAM)  # 数据报协议-->UDP
    
    while True:
        
        msg = input('请输入mag>>>')
        
        client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
        
        data, server_addr = client.recvfrom(1024)
        
        print(data.decode('utf-8'), server_addr)
    
    • UDP是无链接的,先启动哪一端都不会报错

    • UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到

    • UPD协议一般不用于传输大数据。

    • UDP套接字虽然没有粘包问题,但是不能替代TCP套接字,因为UPD协议有一个缺陷:如果数据发送的途中,数据丢失,则数据就丢失了,而TCP协议则不会有这种缺陷,因此一般UPD套接字用户无关紧要的数据发送,例如qq聊天。

    基于socketserver实现并发的socket

    基于TCP协议

    基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环

    socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题)

    server类

    request类

    继承关系

    服务端

    import socketserver
    
    
    class MyHandler(socketserver.BaseRequestHandler):
        def handle(self):
            # 通信循环
            while True:
                data = self.request.recv(1024)
                if len(data) == 0: 
                    break
                self.request.send(data.upper())
    
    
    if __name__ == '__main__':
        server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyHandler, bind_and_activate=True)
    
        server.serve_forever()  # 代表连接循环
        # 循环建立连接,每建立一个连接就会启动一个线程(服务员)+调用Myhanlder类产生一个对象,调用该对象下的handle方法,专门与刚刚建立好的连接做通信循环
    

    客户端1

    import socket
    
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('127.0.0.1', 8080))  # 指定服务端ip和端口
    
    while True:
        msg=input('>>: ').strip()
        if len(msg) == 0: 
            continue
        client.send(msg.encode('utf-8'))
        data = client.recv(1024)
        print(data)
    
    phone.close()
    

    客户端2

    import socket
    
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('127.0.0.1', 8080))  # 指定服务端ip和端口
    
    while True:
        msg=input('>>: ').strip()
        if len(msg) == 0: 
            continue
        client.send(msg.encode('utf-8'))
        data = client.recv(1024)
        print(data)
    
    phone.close()
    

    基于UDP协议

    服务端

    import socketserver
    
    
    class MyHandler(socketserver.BaseRequestHandler):
        def handle(self):
            # 通信循环
            print(self.client_address)
            print(self.request)
    
            data = self.request[0]
            print('客户消息', data)
            self.request[1].sendto(data.upper(), self.client_address)
    
    
    if __name__ == '__main__':
        s = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyHandler)
        s.serve_forever()
    

    客户端1

    import socket
    
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》udp
    
    while True:
        # msg=input('>>: ').strip() #msg=''
        msg = 'client1111'
        client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
        data, server_addr = client.recvfrom(1024)
        print(data)
    
    client.close()
    

    客户端2

    import socket
    
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》udp
    
    while True:
        # msg=input('>>: ').strip() #msg=''
        msg = 'client2222'
        client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
        data, server_addr = client.recvfrom(1024)
        print(data)
    
    client.close()
    
  • 相关阅读:
    du 命令计算隐藏文件夹或文件
    QEMU中VIRTIO实现
    virtio_blk
    网络虚拟化Virtio-net
    virtio desc
    vhost dpdk 共享内存
    gvisor 信号处理
    Java idea 执行单个测试方法
    Java idea 创建User.xml,需要新增一个mybatis-mapper.xml模板
    Java idea 创建log4j.properties
  • 原文地址:https://www.cnblogs.com/Hades123/p/11099748.html
Copyright © 2020-2023  润新知