zoukankan      html  css  js  c++  java
  • udp协议以及socketserver

    udb协议

    udb协议也是一种协议,它和tcp相比既有缺点也有优点

    udb协议所发送的数据可以理解为自带报头,所以他不会出现粘包的情况。但是udp数据只管发送而不管接收,也就是说udp会出现丢包的情况,当客户端的数据服务端没有收到时,客户端并不知道还会继续发数据

    udp协议简单实例

    # 服务器
    import socket
    #udp
    server=socket.socket(type=socket.SOCK_DGRAM)
    
    server.bind(('127.0.0.1', 8003))
    
    while True:
        data,addr=server.recvfrom(1024)
        print(data)
        server.sendto(data.upper(),addr)
    
    # 客户端
    import socket
    #udp
    client=socket.socket(type=socket.SOCK_DGRAM)
    
    while True:
        msg=input('>>:')
        #直接发
        client.sendto(msg.encode('utf-8'),('127.0.0.1', 8003))
        data=client.recvfrom(1024)
        print(data)
    

    socketserver模块

    socketserver主要是用来写服务端并且进行开发的

    拿之前所展示的tcp协议来说,我们之前所用的scp协议是单对单的,换句话说,如果服务器已经和第一个客户端连接,那么第二个客户端就会找不到目标。而socketserver则实现了并发的功能。如果把服务器比作一个饭店的话,他就好像是一个前台的迎宾,当有客户进来的时候,他会叫一名服务员去招待,而如果不用的话,就相当于只有一名服务员,第二个客户进不来了。

    下面将直接把socketserver用实例来进行展示

    #使用socketserver写服务端
    #导入模块
    import socketserver
    
    #自己定义一个类,必须继承BaseRequestHandler
    class MyTcp(socketserver.BaseRequestHandler):
        #必须重写handle方法
        def handle(self):
            try:
                while True :  #通信循环
                    # print(self)
                    #给客户端回消息
                    #conn对象就是request
                    #接收数据
                    print(self.client_address)
                    data=self.request.recv(1024)
                    print(data)
                    if len(data)==0:
                        return
                    #发送数据
                    self.request.send(data.upper())
            except Exception:
                pass
    
    
    if __name__ == '__main__':
        #实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
        #第一个参数是绑定的地址,第二个参数传一个类
        server=socketserver.ThreadingTCPServer(('127.0.0.1',8009),MyTcp)
        #一直在监听
        #这么理解:只要来一个请求,就起一个线程(造一个人,做交互)
        server.serve_forever()
    
    # 客户端
    import socket
    import time
    soc=socket.socket()
    
    soc.connect(('127.0.0.1',8009))
    while True:
        soc.send('xxxx'.encode('utf-8'))
        print(soc.recv(1024))
    

    socketserver模块和udp

    就是简单的将以上俩种相结合就完事了

    #使用socketserver写服务端
    #导入模块
    import socketserver
    
    #自己定义一个类,必须继承BaseRequestHandler
    class MyTcp(socketserver.BaseRequestHandler):
        #必须重写handle方法
        def handle(self):
            print(self)
            #数据
            print(self.request[0])
            print(self.request[1])
            print(type(self.request[1]))
            self.request[1].sendto('xxxx'.encode('utf-8'),self.client_address)
            # try:
            #     while True :  #通信循环
            #         data=self.request.recvfrom(1024)
            #         print(data)
            # except Exception:
            #     pass
    
    
    if __name__ == '__main__':
        #实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
        #第一个参数是绑定的地址,第二个参数传一个类
        server = socketserver.ThreadingUDPServer(('127.0.0.1', 8009), MyTcp)
        #一直在监听
        server.serve_forever()
    
    # 客户端1
    import socket
    import time
    soc=socket.socket()
    
    soc.connect(('127.0.0.1',8009))
    while True:
        soc.send('yyy'.encode('utf-8'))
        print(soc.recv(1024))
    
    # 客户端2
    import socket
    #udp
    client=socket.socket(type=socket.SOCK_DGRAM)
    
    client.sendto('lqz'.encode('utf-8'),('127.0.0.1', 8009))
    # client.sendto('hello'.encode('utf-8'),('127.0.0.1', 8009))
    # client.sendto('world'.encode('utf-8'),('127.0.0.1', 8009))
    # client.sendto(''.encode('utf-8'),('127.0.0.1', 8009))
    data=client.recvfrom(1024)
    print(data)
    
  • 相关阅读:
    MockMvc control层单元测试 参数传递问题
    @GetMapping和@PostMapping接收参数的格式
    获取 request 中用POST方式"Content-type"是"application/x-www-form-urlencoded;charset=utf-8"发送的 json 数据
    测试驱动开发实践—从testList开始
    深度解读
    深度解读
    3年不辭職!記住,在石頭上也要坐3年!(但也要区分5种不值得留的公司,12种留不住人才的公司)
    Configuring Your EMS Server or EMS Console Server on Windows/Linux
    XML 标准诞生 20 周年:这个世界,它无处不在
    通富微电石明达:成熟接班人也是先进生产力(执行力+判断力=抄底)
  • 原文地址:https://www.cnblogs.com/hyc123/p/11502542.html
Copyright © 2011-2022 走看看