zoukankan      html  css  js  c++  java
  • 网络编程 --- UDP

    UDP通信

      数据报协议(自带报头)

      没有双向通道  通信类似于发短信

    UDP的基本使用

    服务端
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1',8080))
    
    data ,addr = sk.recefrom(1024)
    print(data)
    sk.sendto((b'hi'),addr)
    
    客户端
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    ip_port = ('127.0.0.1',8080)
    
    sk.sendto((b'hihi'),ip_port)
    data ,addr = sk.recvfrom(1024)
    print(data)

    TCP与UDP之间的区别

      1.udp协议客户端允许发空

      2.udp协议不会粘包

      3.udp协议服务端不存在的情况下,客户端照样不会报错

      4.udp协议支持并发

    基于UDP通信的简易QQ

    服务端
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1',8080))
    
    while True:
        data ,addr = sk.recvfrom(1024)
        print(data.decode('utf-8))
        info = input('>>:')
        sk.sendto(info.encode('utf-8),addr)
    
    
    客户端1
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    ip_port = ('127.0.0.1',8080)
    
    while True:
        info = input('>>:')
        sk.sendto(info.encode('utf-8),ip_port)
        data ,addr = sk.recvfrom(1024)
        print(data.decode('utf-8')
    
    
    
    
    客户端2
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    ip_port = ('127.0.0.1',8080)
    
    while True:
        info = input('>>:')
        sk.sendto(info.encode('utf-8),ip_port)
        data ,addr = sk.recvfrom(1024)
        print(data.decode('utf-8')
    
    
    
    客户端3
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    ip_port = ('127.0.0.1',8080)
    
    while True:
        info = input('>>:')
        sk.sendto(info.encode('utf-8),ip_port)
        data ,addr = sk.recvfrom(1024)
        print(data.decode('utf-8')

    Socketserver模块

    tcp服务端
    
    import  socketserver
    
    
    class MyServer(socketserver.BaseRequestHandler)
        def handle(self):
             while True:
                data = self.request.recv(1024)
                print(self.client_address)
                print(data.decode('utf-8'))
                self.request.send(data.upper())
               
    
    if __name__ == '__main__':
        """只要有客户连接  会自动交给自定义类中的handle方法去处理"""
        server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)
        server.serve_forever()  # 启动该服务对象
    
    
    
    服务端
    
    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',8080))
    
    while True:
        sk.send(b'hi')
        data = sk.recv(1024)
        print(data)
    udp服务端
    import socketserver
    
    class MyServer(socketserver.BaseRequestHandler):
        def handle(self):
            while True:
                data,sock = self.request
                print(self.client_address)
                print(data.decode('utf-8'))
                sock.sendto(data.upper(),self.client_address)
    
    if __name__ == '__main__':
        server = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyServer)
        server.serve_forever()
    
    
    udp客户端
    import socket
    import time
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    ip_port = ('127.0.0.1',8080)
    
    
    while True:
        sk.sendto(b'h',ip_port)
        data ,addr = sk.recvfrom(1024)
        print(data.decode('utf-8'))
        time.sleep(1)

    异常处理

      什么是异常?
        程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表现出来,造成的影响就是整个程序无法在正常运行

      异常的结构   

      1.异常的类型:NAMEERROR
      2.异常的信息:name 'fdsdfsdf' is not defined
      3.异常的位置:Traceback (most recent call last):
            File "D:/python脱产10期视频/day29/01 异常处理.py", line 1, in <module>
              fdsdfsdf

    异常的种类

      分为两大类

        1.语法错误

          是你程序立刻就能解决的,这种错误是不能被容忍的,语法上的错误,发现之后应该立刻解决

        2.逻辑错误

          这种错误是可以被容忍的,因为一眼看不出来,针对逻辑上的错误  可以采用异常处理机制进行捕获

      常见的错误类型

        NAMERROR 名字错误

        SyntaxError 语法错误

        KeyError 键不存在

        ValueError 值错误

        IndexError 索引错误

    如何避免

      异常处理

        在你认为可能出现bug的代码块上方try一下:注意try内部的代码越少越好

      语法结构

        try:

          可能出错的代码

        except 出错的类型 as e:   # 将报错信息赋值给变量e

          出错之后的处理机制

    # try:
    #     name
    #     l = [1,2,3]
    #     l[111]
    #     d = {'name':'jason'}
    #     d['password']
    # except NameError:
    #     print('NameError')
    # except IndexError:
    #     print('indexerror')
    # except KeyError:
    #     print('keyerror')
    """
    错误发生之后  会立刻停止代码的运行
    执行except语句 比对错误类型
    """
    
    
    # try:
    #     # name
    #     l = [1,2,3]
    #     l[111]
    #     # d = {'name':'jason'}
    #     # d['password']
    # except Exception:  # 万能异常  所有的异常类型都被捕获
    #     print('老子天下无敌')
    # else:
    #     print('被检测的代码没有任何的异常发生 才会走else')
    # finally:
    #     print('无论被检测的代码有没有异常发生 都会在代码运行完毕之后执行我')

    主动抛出异常

    # 主动抛异常
    # if 'egon' == 'DSB':
    #     pass
    # else:
    #     raise TypeError('尽说大实话')
    # 关键字raise就是主动抛出异常

    断言(预言的意思)

    # l = [1,2,3]
    # assert len(l) < 0  # 断言  预言
    # 猜某个数据的状态 猜对了 不影响代码执行 正常走
    # 猜错了  直接报错

    自定义异常

    class MyError(BaseException):
         def __init__(self,msg):
             super().__init__()
             self.msg=msg
         def __str__(self):
             return '<dfsdf%ssdfsdaf>' %self.msg
    
    raise MyError('我自己定义的异常')  # 主动抛出异常其实就是将异常类的对象打印出来,会走__str__方法
  • 相关阅读:
    二十几岁的事情之一,缩小理想!
    mysql数据库建表分类字段--尽量少用字符串--原因探索
    Linux 提升逼格之 命令别名 分享
    git 认证问题之一的解决 : http ssh 互换
    rabbitmqctl 命令整理
    golang 用defer 捕获error 需小心
    Linux 常用命令 随口说
    随便记录几个点
    喜鹊开发者(The Magpie Developer)
    主流开放平台接口说明
  • 原文地址:https://www.cnblogs.com/KrisYzy/p/11321851.html
Copyright © 2011-2022 走看看