网络编程——UDP协议,SocketServer模块介绍

一、UDP 数据报协议
特点:
①客户端允许发空————默认有报头
②协议不会粘包
③在服务端不存在的情况下,客户端不会报错
④udp 协议支持并发效果
注:udp在启动服务之后,只能被动等待客户端发消息,客户端发送消息是需要带上服务端地址
       同理,在服务端回消息是也要带上客户端地址
示例:

import socket

server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))

msg, addr = server.recvfrom(1024)
print(msg.decode('utf-8'))
server.sendto(b'hello', addr)

server.close()
服务端
import socket

client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)

client.sendto(b'hello server baby!', server_addr)
msg, addr = client.recvfrom(1024)
print(msg, addr)
客户端

总结:

TCP协议就类似于打电话

UDP 协议就类似于发短信

二、SocketServer模块介绍(让tcp也能支持并发)
1、基于tcp协议的SocketServer:

import socketserver


class MyBaby(socketserver.BaseRequestHandler):
    def handle(self):
        # 通信循环
        while True:
            # self.request相当于你的conn通信对象
            data,sock = self.request # 收消息
            print(data)
            sock.sendto(data.upper(),self.client_address)  # self.client_address客户端地址


if __name__ == '__main__':
    server = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyBaby)
    server.serve_forever()
TCP 服务端
import socket

client = socket.socket()
client.connect(('127.0.0.1',8080))

while True:
    client.send(b'hello')
    data = client.recv(1024)
    print(data)
TCP 客户端

2、基于udp协议的SocketServer:

import socketserver


class MyBaby(socketserver.BaseRequestHandler):
    def handle(self):
        # 通信循环
        while True:
            # self.request相当于你的conn通信对象
            data,sock = self.request # 收消息
            print(data)
            sock.sendto(data.upper(),self.client_address)  # self.client_address客户端地址
UDP 服务端
import socket
import time

client = socket.socket(type=socket.SOCK_DGRAM)
sever_addr = ('127.0.0.1',8080)

while True:
    client.sendto(b'hello',sever_addr)
    data,addr = client.recvfrom(1024)
    print(data,addr)
    time.sleep(1)
UDP 客户端
原文地址:https://www.cnblogs.com/king-home/p/10813847.html