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)

  

 

异常处理

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

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

整个程序无法运行

异常的种类

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)

  

 

猜你喜欢

转载自www.cnblogs.com/le-le666/p/11324298.html