网络编程 --- 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__方法
posted @ 2019-08-08 16:16  Yzy~Yolo  阅读(190)  评论(0)    收藏  举报