网络通信 Python Socket TCP

前言

工作中遇到各种各样的网络通信。有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))

代码说明

  1. (HOST, PORT) python元组类型,一种不可改变的数组
  2. bytes([0x31, 0x32, 0x33, 0x34]) python字节数组,通过decode方法可解码为string类型,同理string类型通过encode方法可编码为bytes类型。另外,bytes类型为不可变类型,对应的可变类型为bytearray
  3. sendall输入参数为bytes类型,recv返回参数也为bytes类型
  4. 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)

代码说明

  1. accept()方法返回两个参数,conn可理解为套接字句柄,address为对端地址(客户端地址)
  2. 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 机械工业出版社 【京东链接
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 11,131评论 0 10
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 10,232评论 0 11
  • 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...
    蛋炒饭_By阅读 4,997评论 0 10
  • 说明 本文 翻译自 realpython 网站上的文章教程 Socket Programming in Pytho...
    keelii阅读 6,621评论 0 16
  • 个人翻译,转载请注明出处,谢谢! Adobe's Real Time Messaging Protocol 摘要 ...
    SniperPan阅读 7,746评论 1 17