网络编程(四)--基于udp协议的套接字、socketserver模块
一、UDP协议(数据报协议)
1、何为udp协议
不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
以太网头 | ip头 | udp头 | 数据 |
2、udp协议的特点
(1)传输数据以数据报的形式传送。因为数据以数据包的形式发送,所以没发送一次就会接收一次
from socket import * server=socket(AF_INET,SOCK_DGRAM)
server.bind(('127.0.0.1',8081)) print(server.recvfrom(1024))
print(server.recvfrom(1024))
print(server.recvfrom(1024)) # (b'hello', ('127.0.0.1', 56816))
# (b'world', ('127.0.0.1', 56816))
# (b'sdfas', ('127.0.0.1', 56816))
服务端
from socket import * client=socket(AF_INET,SOCK_DGRAM) client.sendto(b'hello',('127.0.0.1',8888))
client.sendto(b'world',('127.0.0.1',8888))
client.sendto(b'sdfas',('127.0.0.1',8888))
客户端
二、基于udp协议的套接字
udp是无链接的,先启动哪一端都不会报错
from socket import * # 1.创建套接字对象
server = socket(AF_INET, SOCK_DGRAM) # 2.绑定服务器IP地址和端口号
server.bind(('127.0.0.1', 8888)) # 3.收发消息
while True:
data, cli_addr = server.recvfrom(1024) # 收到的是数据和客户端地址
print(data)
server.sendto(data.upper(), cli_addr) # 发送消息,根据客户端地址发送消息 server.close()
服务端
from socket import * # 1.创建套接字对象
server = socket(AF_INET, SOCK_DGRAM) # 2.发收消息
while True:
client.sendto('hello'.encode('utf-8'), ('127.0.0.1', 8888)) # 根据地址发送消息
data, ser_addr = client.recvfrom(1024) # 收消息,获得服务端的消息和地址
print(data)
客户端
三、socketserver模块
1、作用
利用socketserver模块可以实现并发
2、基于TCP协议的并发
自定义类中:
- self.request 即一个套接字对象
- self.client_address 即客户端地址
# 服务端
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True: # 通信循环
try:
data = self.request.recv(1024)
print(data.decode('utf-8'))
self.request.send(data.upper())
except ConnectionResetError:
break if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1', 8888), MyTCPHandler)
server.serve_forever() # 链接循环
# 客户端
from socket import * cli_socket = socket(AF_INET, SOCK_STREAM) cli_socket.connect(('127.0.0.1', 8888)) while True:
cli_socket.send('hello'.encode('utf-8'))
data = cli_socket.recv(1024)
print(data.decode('utf-8')) cli_socket.close()
3、基于UDP协议的并发
自定义类中:
- self.request是一个元组(第一个元素是客户端发来的数据,第二部分是服务端的udp套接字对象),如(b'adsf', <socket.socket fd=200, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>)
- self.client_address即客户端地址
# 服务端
import socketserver class MyUDPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True: # 通信循环
print(self.request) # (b'hello', <socket.socket fd=216, family=AddressFamily.AF_INET,
type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8888)>)
data, sock = self.request
sock.sendto(data.upper(), self.client_address) if __name__ == '__main__':
server = socketserver.ThreadingUDPServer(('127.0.0.1', 8888), MyUDPHandler)
server.serve_forever() # 链接循环
#客户端
from socket import * cli_socket = socket(AF_INET, SOCK_STREAM) while True:
cli_socket.sendto('hello'.encode('utf-8'), ('127.0.0.1', 8888))
data, server_addr = cli_socket.recvfrom(1024)
print(data.decode('utf-8')) cli_socket.close()
网络编程(四)--基于udp协议的套接字、socketserver模块的更多相关文章
- 网络编程(基于udp协议的套接字/socketserver模块/进程简介)
一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...
- 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket
目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...
- python 之 网络编程(基于UDP协议的套接字通信)
8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...
- 基于udp协议的套接字,socketserver模块,多道技术,进程理论
进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念 进程vs程序 程序:一堆的代码 进程:程序执行的过程 进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统的其他所有 ...
- python 之 网络编程(基于TCP协议的套接字通信操作)
第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...
- 网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用
基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. ...
- 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
一.客户端/服务器架构(C/S架构) 即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...
- 网络编程[第二篇]基于udp协议的套接字编程
udp协议下的套接字编程 一.udp是无链接的 不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息, ...
- 网络编程基础:粘包现象、基于UDP协议的套接字
粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...
随机推荐
- ProceedingJoinPoint获取实现类接口上的注解
使用aspectj处理拦截aop,需要获取实现类接口上的注解 public Object around(ProceedingJoinPoint pjp) throws Throwable{ long ...
- linux在目录下查字符串, 查文件数目
在目录下所有文件中查找某个字符串(递归查) grep -rnl '字符串' 目录名 统计一个文件夹下目录数或文件数, 如下分步讲解: 1. 显示目录下内容: ls -l ...
- Umi + Dva的数据传递学习Demo(代码有详细注释)
刚学习时写了篇笔记,以免自己忘记,用了一段时间后,觉得不如做个demo,代码写上注释,方便也在学习umi-dva的同学们理解更好,更容易上手. 这可能是网上注释最多,看了最易理解的学习小指南吧,哈哈. ...
- 开源推荐 - CoDo开源一站式DevOps平台
一群有梦想的年轻人开源了一个云管理平台,他们的口号是:让天下没有996的运维 有幸参与到CoDo项目的开发,这是一个非常棒的一站式开源运维平台,分享给大家 平台介绍 CODO是一款为用户提供企业多混合 ...
- impala进阶
一.impala存储 1.文件类型 2.压缩方式 二.impala分区 1.创建分区方式 partitioned by 创建表时,添加该字段指定分区列表: create table t_person( ...
- nginx ubantu 安装步骤
Ubuntu14.04默认安装的是Nginx 1.4.6 如果已经安装,请先卸载sudo apt-get remove nginx最新的稳定版Nginx 1.6.0在ubuntuupdates ppa ...
- activiti在线画流程图
springboot2.2 activiti6.0 activiti-modeler 5.22.0 注明:版本不一样会导致报错 上一篇:springboot整合activiti 效果图 代码分享:ht ...
- 好用的低延迟vps
ZeptoVM是一个俄罗斯的云提供商, 由于提供了黑龙江北边的机房, 所以延迟比较低 注意一定要选Khabarovsk节点, 这个节点延迟很低, 我在上海延迟大约有70ms 缺点就是比较贵, 按照年付 ...
- 深入理解C语言 - 指针使用的常见错误
在C语言中,指针的重要性不言而喻,但在很多时候指针又被认为是一把双刃剑.一方面,指针是构建数据结构和操作内存的精确而高效的工具.另一方面,它们又很容易误用,从而产生不可预知的软件bug.下面总结一下指 ...
- tensorflow 梯度裁剪
gvs = optimizer.compute_gradients(loss) # 计算出梯度和变量值 capped_gvs = [(tf.clip_by_value(grad, -5e+10, 5e ...