zoukankan      html  css  js  c++  java
  • udp以及socketserver模块用法

    异常处理

    程序在运行中出现了不可预知的错误

    并且该错误没有对应的处理机制,那么就会以异常的形式表现出来

    整个程序无法运行

    异常的种类

    1 NameError 名字错误

    2 SyntaxError 语法错误

    3 KeyError 键不存在

    4 ValueError 值错误

    5 IndexError 索引错误

    6 Exception/BaseException 可以接受所有错误

    如何避免 异常处理 在你认为可能会出现bug的代码块上方try一下:注意try内部的代码块越少越好

            try:
                可能出错的代码
            except 出错的类型 as e:  # 将报错信息赋值给变量e
                出错之后的处理机制
    try:
        name
        l = "asdasd"
        l[12312313]
    ​
    except Exception:
        print("asdasd")
    ​
    else:
        print("asdasd")
    finally:
        print("assdasd")

    这是异常的最复杂结构了

    udp通信

    又叫数据报协议(自带报头)

    没有双向通道,与tcp相比,udp就是发短信(只管给你发,不管你是否能收到),tcp就是打电话(必须我们先要拨通手机才才能通信)

    代码格式,后tcp的不同点

    服务端

    import socket
    
    # 创建套接字对象
    server = socket.socket(type=socket.SOCK_DGRAM)
    # 还需绑定端口
    server.bind(("127.0.01", 8181))
    
    # 直接发生和接收消息,不需要在listen和accept了
    
    date, address = server.recvfrom(1024)
    print(date, address)
    server.sendto(b'adassd', address)

    客户端

    import socket
    ​
    # 创建一个套接字对象
    client = socket.socket(type=socket.SOCK_DGRAM)
    ​
    # 设置一个IP地址和端口号的变量
    address = ("127.0.0.1", 8181)
    ​
    # 发送消息用sendto并且需要两个参数一个是发送的消息还有一个是地址,与tcp不同的是,tcp用的send只需要一参数
    client.sendto(b'asdasda', address)
    ​
    # 接收消息过后也有两个参数,第一个是消息内容,还有一个是ip端口tcp只有一个参数,接收的是信息
    date, address = client.recvfrom(1024)
    print(date, address)

    基于udp我们可以写一个简易版的QQ

    服务端

    import socket
    ​
    server = socket.socket(type=socket.SOCK_DGRAM)
    server.bind(("127.0.0.1",8787))
    while True:
    ​
        date,address = server.recvfrom(1024)
        print(date.decode("utf-8"),address)
    ​
        msg = input("请输入内容").strip().encode("utf-8")
    ​
        server.sendto(msg,address)

    客户端

    import socket
    ​
    client = socket.socket(type=socket.SOCK_DGRAM)
    address = ("127.0.0.1",8787)
    ​
    while True:
        msg = input("请输入内容").strip().encode("utf-8")
        client.sendto(msg,address)
    ​
        date,addre = client.recvfrom(1024)
        print(date.decode("utf-8"),addre)

    udp的四个特点

    1允许发空

    2不粘包

    3协议服务端断开,客户端也不会报错

    4支持并发

    socketserver

    可以让,tcp向udp一样的并发编程

    服务端可以与多个客户端同时交流

    服务端

    import socketserver
    ​
    # 先创建一个类,继承 socketserver.BaseRequestHandler
    class MyServer(socketserver.BaseRequestHandler):
        # 定义一个方法handler里面写发送语句,和接收语句
        def handle(self):
            while True:
                date = self.request.recv(1024)
                print(self.client_address)
                print(date.decode("utf-8"))
                self.request.send(date.upper())
    ​
    if __name__ == '__main__':
        
        # 创建对象,将端口,和我们创建的类,传给对象
        server = socketserver.ThreadingTCPServer(("127.0.0.1",8888),MyServer)
        # 调用serve_forever方法
        server.serve_forever()

    客户端1

    可以多个客户端,与服务端交互

    import socket
    ​
    client = socket.socket()
    client.connect(("127.0.0.1",8888))
    ​
    while True:
        client.send(b'asdad')
        date = client.recv(1024)
        print(date)
    

      

    客户端2

    import socket
    ​
    client = socket.socket()
    client.connect(("127.0.0.1",8888))
    ​
    while True:
        client.send(b'asdad')
        date = client.recv(1024)
        print(date)
    

      

     

  • 相关阅读:
    详解著名的awk Oneliner,第三部分:选择性输出特定行
    显示特定行
    nWave指令
    make 命令
    VIM脚本变量
    terninal 快捷键
    vim 实现begin end 配对 使用matchit插件
    VIM删除重复行
    linux命令--find(1)
    zabbix--创建触发器
  • 原文地址:https://www.cnblogs.com/le-le666/p/11324298.html
Copyright © 2011-2022 走看看