前言
工作中遇到各种各样的网络通信。有MQTT和CoAP这样的物联网应用层协议,也有各种自定义的TCP或UDP协议。使用各种不同的计算机语言和框架开发网络通信,例如Java的Netty框架,C语言原始socket,Python Socket。各有各的使用场景,难易程度相差巨大。Netty上手困难,C语言编写复杂,Python Socket上手容易。
本文先从最简单的Python入手,相较于其他手段(例如C Socket或Java Netty)使用Python实现一组Echo Client和Echo Server代码行数最少。
示例简述
- 客户端主动发送一组数据至服务器,收到服务器的响应后打印至控制台
- 服务器收到客户端的请求后,把请求内容原样返回值客户端
- 本例模拟,物联网终端设备与服务器通信,推荐使用bytes类型而不是string
- 开发环境 Windows PyCharm社区版 Python3.7
客户端示例
echo-client
import socket
import binascii
HOST = '127.0.0.1'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
request = bytes([0x31, 0x32, 0x33, 0x34])
s.sendall(request )
response = s.recv(1024)
print('Received', binascii.hexlify(response))
代码说明
- (HOST, PORT) python元组类型,一种不可改变的数组
- bytes([0x31, 0x32, 0x33, 0x34]) python字节数组,通过decode方法可解码为string类型,同理string类型通过encode方法可编码为bytes类型。另外,
bytes
类型为不可变类型,对应的可变类型为bytearray
- sendall输入参数为
bytes
类型,recv返回参数也为bytes类型 - binascii.hexlify(response) 通过HEXSTRING格式打印至控制台
服务器示例
echo-server
import socket
import binascii
HOST = ''
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5)
while True:
conn, address = s.accept()
request = conn.recv(1024)
print('Connected by', repr(address),
'Received ', binascii.hexlify(request))
if request:
conn.sendall(request)
代码说明
- accept()方法返回两个参数,conn可理解为套接字句柄,address为对端地址(客户端地址)
- binascii.hexlify(response),通过HEXSTRING格式打印至控制台
运行与测试
先启动服务器,再启动客户端。
服务器控制器输出
Connected by ('127.0.0.1', 65225) Receive b'30313234'
客户端控制台输出
Received b'31323334'
总结
- 本例中的服务器示例并不能适应高并发场景
- 本例中的客户端可用于各种调试
相关资料
- 本例代码仓库【 python-socket-demo】
- 物联网图书推荐 CoAP基础 徐凯《IoT开发实战: CoAP卷》 2017 机械工业出版社【 京东链接】
- 物联网图书推荐 CoAPs进阶 徐凯 崔红鹏《密码技术与物联网安全:mbedtls开发实战》2019 机械工业出版社 【京东链接】
网友评论