UDP协议&socketserver模块
时间:2019-09-16
本文章向大家介绍UDP协议&socketserver模块,主要包括UDP协议&socketserver模块使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、UDP协议
1.1 UDP实现简单通信
服务器
-------------------------------------------------------------
import socket
soc= socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #socket.SOCK_DGRAM是UDP协议
soc.bind(('127.0.0.1',8080)) #绑定地址和端口号
while True: #通信循环
data,addr = soc.recvfrom(1024) #无需等待接收和监听
print(data)
soc.sendto(data.upper(),addr) #将处理好的数据发送给客户端
客户端
------------------------------------------------------------
import socket
soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #实例化一个对象
while True: #通信循环
msg= input('请输入数据>>>').strip()
msg = msg.encode('utf8') #将数据转化为bytes格式
soc.sendto(msg,('127.0.0.1',8080))
data = soc.recvfrom(1024) #接收数据
print(data[0]) #打印数
1.2 UDP的特点
- 可以发空内容(数据报协议,有数据头)
- 不需要建连接(所以他不可靠)
- 不回粘包
- 不可靠(客户端,服务端谁断开都不影响发送消息)
1.3 UDP与TCP的区别
TCP | UDP |
---|---|
可靠连接 | 不可靠连接 |
基于数据流的传输 | 基于数据报的传输 |
粘包 | 不粘包 |
不丢包 | 丢包 |
二、socketserver模块
可以实现并发编程,让多个客户端同时访问,服务器同时处理多个客户端发来的数据
2.1 socketserver模块实现TCP简单通信
服务端
-----------------------------------------------------------------------------------
import socketserver #导入模块
class MyTcp(socketserver.BaseRequestHandler): #继承一个类,带有Base的都是基类
def handle(self): #必须重写handle方法
try:
while True:
#request其实就是之前conn对象
data = self.request.recv(1024) #接收数据
if len(data)== 0: #如果数据发的是空
return #直接结束
self.request.send(data.upper()) #将数据变大写发送给客户端
except Exception:
pass
if __name__ == '__main__':
#实例化一个socketserver对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
soc= socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTcp) #第一个参数是绑定的地址,第二个参数是自定义的类
soc.serve_forever() #只要来一个客户端,我们就给他一个线程做交互
客户端
-----------------------------------------------------------------------------
import socket #客户端不需要用socketserver来实现
soc = socket.socket()
soc.connect(('127.0.0.1',8080))
while True:
msg = input('请输入数据>>>').strip()
msg = msg.encode('utf8')
data= soc.send(msg)
print(soc.recv(1024))
2.2 socketserver模块实现UDP简单通信
服务器
--------------------------------------------------------------------------------------
import socketserver
class MyUdp(socketserver.BaseRequestHandler):
def handle(self):
print(self.request[0]) #b'dfgh'
#<socket.socket fd=544, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>
print(self.request[1])
print(type(self.request[1])) #<class 'socket.socket'>
data = self.request[0].decode('utf8')
data = data.upper().encode('utf8')
# self.request(tcp / udp是不一样的)
self.request[1].sendto(data,self.client_address) #self.client_address客户端地址
if __name__ == '__main__':
soc = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUdp)
soc.serve_forever()
客户端
---------------------------------------------------------------------------------------
import socket
soc = socket.socket(type = socket.SOCK_DGRAM)
while True:
msg = input('请输入数据>>>').strip()
msg = msg.encode('utf8')
soc.sendto(msg,('127.0.0.1',8080))
data = soc.recvfrom(1024) #他是bytes形式
print(data[0].decode('utf-8')) #转为str格式
原文地址:https://www.cnblogs.com/lulingjie/p/11529045.html
- 玩转数据地图系列之——地图上的迷你条形图
- 树上倍增求LCA及例题
- 深度强化学习-DDPG算法原理和实现
- 你绝对想不到,数据地图还能这么玩~
- TensorFlow从0到1 - 17 - Step By Step上手TensorBoard
- 深度强化学习-Actor-Critic算法原理和实现
- 深度强化学习-Policy Gradient基本实现
- TensorFlow从0到1 - 7 - TensorFlow线性回归的参数溢出之坑
- 买卖股票算法题的后续!
- 一个例子教你如何与出题人斗智斗勇
- 用数据来聊聊国产电影~
- 如何买卖股票?不要慌,我有妙招!
- 2017.11.7解题报告
- TensorFlow从0到1 - 11 - 74行Python实现手写体数字识别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS 6.5平台本地YUM配置的方法
- Linux环境(CentOS6.7 64位)下安装subversion1.9.5的方法
- CentOS 6.5平台实现快速部署FTP的方法
- Linux系统中sudo命令的十个技巧总结
- 详解linux电源管理驱动编写
- CentOS6.5系统简单安装与配置Nginx服务器的方法
- 详解linux 摄像头驱动编写
- Ubuntu16.04搭建NFS 文件共享服务器的方法
- 详解linux pwm驱动编写
- Ubuntu 16.04 LTS系统里中文txt文件打开的问题解决
- linux nand flash驱动编写
- 在Linux中使用Vundle管理Vim插件的方法
- 详解linux添加硬盘分区挂载教程
- CentoS6.5环境下redis4.0.1(stable)安装和主从复制配置方法
- 详解linux dma驱动编写