前言

工作中遇到各种各样的网络通信。有MQTT和CoAP这样的物联网应用层协议,也有各种自定义的TCP或UDP协议。使用各种不同的计算机语言和框架开发网络通信,例如Java的Netty框架,C语言原始socket,Python Socket。各有各的使用场景,难易程度相差巨大。Netty上手困难,C语言编写复杂,Python Socket上手容易。

长久以来,UDP通信一直被误解为一种不可靠的通信手段,但是UDP简单使用,特别适合物联网终端。UDP没有三次握手和四次挥手,换个角度来说节约了网络流量,降低了设备的功耗。UDP协议也是物联网应用层协议CoAP、LwM2M的传输层协议,也有消息说HTTP 3.0协议将使用UDP作为传输层协议

示例简述

本例通过select实现一个UDP Server,一般来说select相比其他recv和send等常用函数难用不少,网上也很难找到合适的示例,特别是UDP Select示例。

开发环境 Windows PyCharm社区版 Python3.7

服务器示例

udp-server-select.py

import select

import socket

import binascii

HOST = ''

PORT = 50018

server_fd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

server_fd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

server_fd.bind((HOST, PORT))

print('starting up on %s port %s' % (HOST, PORT))

# 把服务器套接字加入到输入列表中

inputs = [server_fd]

client_address = None

conn = None

while True:

# readable, writable, exceptional = select.select(inputs, [], [], 1.0)

readable = select.select(inputs, [], [], 1.0)[0]

for s in readable:

data, client_address = s.recvfrom(1024)

if data:

# 收到客户端数据

print('received "%s" from %s' % (binascii.hexlify(data), client_address))

s.sendto(data, client_address)

代码说明

inputs = [server_fd] 创建套接字后把服务器套接字加入到输入列表中

select函数有4个输入参数,分别为输入列表、输出列表、错误列表和超时时间,输出参数为一个Python元组类型,分别为可读列表、可写列表和错误列表。select函数原型如下:

select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)

如果仅需要查询可读列表,可以简写为select.select(inputs, [], [], 1.0)[0],也就是选择select返回元组类型的第0个元素。

客户端示例

运行与测试

先启动UDP服务器,再启动UDP客户端。

服务器控制台可能输出

connected by ('127.0.0.1', 50019) received b'31323334'

connected by ('192.168.3.18', 50019) received b'31323334'

客户端控制台可能输出

received b'31323334' from ('127.0.0.1', 50018)

相关资料

物联网图书推荐 CoAP基础 徐凯《IoT开发实战: CoAP卷》 2017 机械工业出版社【 京东链接】

物联网图书推荐 CoAPs进阶 徐凯 崔红鹏《密码技术与物联网安全:mbedtls开发实战》2019 机械工业出版社 【京东链接】

python socket sendto sendall_网络通信 Python Socket UDP Select相关推荐

  1. Python C/S架构,网络通信相关名词,socket编程

    主要内容: 一.  C/S架构 二. 网络通信的相关名词 三. socket编程 一. C/S架构和B\S架构概述 1. C/S架构: Client/Server(客户端/服务端)架构 描述: C/S ...

  2. python实现udp聊天室_python网络编程基础--socket的简介,以及使用socket来搭建一个简单的udp小程序...

    socket介绍: socket(简称套接字),是进程间通讯的一个工具,他能实现把数据从一方传输到另一方,完成不同电脑上进程之间的通讯,它好比数据的搬运工. socket应用: 不夸张来说,只要跟网络 ...

  3. Python之路 - 网络编程之Socket

    Python之路 - 网络编程之Socket C/S架构 ? Socket ? 基于TCP ? 基于UDP ? Socket对象方法 ? C/S架构 ? 在网络通信中 , 一般是一方求一方应 , 求的 ...

  4. Python网络与并发编程 01 Socket编程

    前瞻知识 C/S架构 C/S架构是一种由服务端(Server)和客户端(Client)组成的双层架构. 互联网中处处充满了C/S架构(Client/Server),比如我们需要玩英雄联盟,就必须连接至 ...

  5. python socket编程_Python学习记录-socket编程

    1. OSI七层模型详解 2. Python socket 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答 ...

  6. python远程调用摄像头_Python设置Socket代理及实现远程摄像头控制的例子

    为python设置socket代理首先,你得下载SocksiPy这个.解压出来之后里面会有一个socks.py文件.然后你可以把这个文件复制到python安装目录里面的Lib\site-package ...

  7. Python进阶【第一篇】socket

    1.socket()模块函数 要使用socket.socket()函数来创建套接字.其语法如下: socket.socket(socket_family,socket_type,protocol=0) ...

  8. python套接字socket的作用_【学习笔记】python实现的套接字socket

    #############2014.5.13 update############## #更新了多进程服务端的bug:客户端强行关闭会出错# ############################# ...

  9. python文件传输socket_树莓派采用socket方式文件传输(python)

    两个树莓派,在同一个局域网内,传输文件,采用socket方式. client端代码: import socket import os import hashlib client = socket.so ...

最新文章

  1. 图片上两点之间的距离和两组图片之间的差异的关系
  2. 实现Qt日志功能并输出到文件
  3. boost::gil::for_each_pixel用法的测试程序
  4. vue wabpack 切换开发环境 和生成环境 的接口地址
  5. 未来数据中心的五大“走心”创新
  6. Redis单机和集群环境搭建
  7. java12/6作业1
  8. 空闲队列函数排队 requestIdleCallback
  9. 手机网络游戏系统架构图
  10. 微信公众号实现消息模板的推送
  11. poi-3.17版本 和若依框架结合--excel导出,excel图片导出
  12. 【XJTUSE计算机图形学】第四章 真实感图形学(1)——–颜色视觉
  13. 列举五样计算机常见故障,项目五计算机常见故障和排除.ppt
  14. 常见bat命令(二)
  15. mysql数据库系统时区_mysql 杂记 —— 时区问题
  16. 用python的sympy解符号方程组
  17. SSH登录异常(someone is doing something nasty)
  18. Nature:交互式语言的语音规划网络
  19. 湖南财务大数据比赛代码2018-12-20
  20. 亚稳态与信号跨时钟域介绍

热门文章

  1. 系统上线后关键用户的工作建议
  2. Oracle的一点注意点
  3. 批量下载ABAP程序和表结构
  4. 抓取标准报表ALV GRID上的数据
  5. 波司登在“寒潮”下再创新高,羽绒服行业真的靠天吃饭?
  6. linux apt qt下载,Linux如何安装 apt-get 软件管理工具
  7. mysql 倒序 分页_nodeJS与MySQL实现分页数据以及倒序数据
  8. Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...
  9. 全面讲解Python字典;--什么是字典?字典的常用方法;创建空字典并赋值,增删改查字典中的元素
  10. Python中必须知道的知识点:上下文管理器