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格式
UDP协议&socketserver模块的更多相关文章
- (day27)subprocess模块+粘包问题+struct模块+ UDP协议+socketserver
目录 昨日回顾 软件开发架构 C/S架构 B/S架构 网络编程 互联网协议 socket套接字 今日内容 一.subprocess模块 二.粘包问题 三.struct模块 四.UDP 五.QQ聊天室 ...
- python异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-3
异常捕获 异常:程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表现出来 影响:整个程序无法再正常运行 异常的结构 异常的类型 NameError 异常的信息 ...
- socketserver模块TCP和UDP协议形式
# >>>>>>>>>>>>>>>>>>>>服务端socketserver模块通 ...
- 基于udp协议的套接字,socketserver模块,多道技术,进程理论
进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念 进程vs程序 程序:一堆的代码 进程:程序执行的过程 进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统的其他所有 ...
- 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- 网络编程(基于udp协议的套接字/socketserver模块/进程简介)
一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...
- 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- 网络编程(四)--基于udp协议的套接字、socketserver模块
一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头 ...
- Python进阶----UDP协议使用socket通信,socketserver模块实现并发
Python进阶----UDP协议使用socket通信,socketserver模块实现并发 一丶基于UDP协议的socket 实现UDP协议传输数据 代码如下:
随机推荐
- 手动升级 Confluence 6 - 升级问题解决
升级失败了? 如果你需要对你的升级进行回退,你必须首先恢复你老的 Confluence 备份.不要尝试再次进行升级,也不要尝试再次对升级失败的 Confluence 进行再次启动. 在升级过程中遇到 ...
- Spring Boot教程(二十六)使用Spring Security安全控制
准备工作 首先,构建一个简单的Web工程,以用于后续添加安全控制,也可以用之前Chapter3-1-2做为基础工程.若对如何使用Spring Boot构建Web应用,可以先阅读<Spring B ...
- 在spring官网上下载历史版本的spring插件,springsource-tool-suite
目前spring官网(https://spring.io/tools3/sts/all)上可下载的spring插件只有: ECLIPSE ARCHIVE SIZE 4.9.0 springsource ...
- ORA-01652: 无法通过 128 (在表空间 HIS_TABLESPACE_TEMP 中) 扩展 temp 段
前言:采用jmeter进行压力测试,大概向oracle 添加了140W条数据. 结果系统涉及到该表的业务都异常卡.访问阿里巴巴的那个druid monitor,因为系统中集成了,查看sql监控中的sq ...
- PHP 最完美调用百度翻译接口代码示例 (原)
php调用百度翻译最新接口代码 问 题:写的过程遇到了一个问题,url拼接好的原翻译内容,appid,sign的地址直接输出到浏览器可以打开看到翻译后的返回值,但是各种curl,file_ ...
- Java容器——Set和顺序存储
当Set使用自己创建的类型时,存储的顺序如何维护,在不同的Set实现中会有不同,而且它们对于在特定的Set中放置的元素类型也有不同的要求: Set(interface) 存入Set的每个元素都必须是唯 ...
- Unknown tag (s:property)的原因
今天在做struts2的练习,然后在jsp页面我使用<s:property value="name"/>竟然报错, 然后网上走了下,恍然大悟,我原来没有在jsp页面里面 ...
- Hidden的应用
在写jsp中如果一个 请求的参数(例如:paramTypeCode)不能在另一个请求中使用,我们为了能让他在请求中使用可以利用隐藏域来表示,下面介绍他的用法: 1 <input type= ...
- 全面解读php-面向对象
一.类的自动载入 //类的自动载入我们使用 spl_autoload_register($autoload_function ).我们需要在不同的地方包含更多不同的类文件,只需要多写几个 $autol ...
- Ubuntu 16.04下安装sublime Text的插件
Sublime Text是什么: 它是一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相比于难于上手的Vim,浮肿沉重 ...