前言
近日,有客户提出一个问题,新版本的固件调用socket send接口发送数据给TCP Server,然后立刻调用recv接口接收TCP服务器返回的数据,时间差较上个版本增大500ms,但是客户没法提供调试环境,代码之前也是其他同事负责的,于是思考使用python开发一个TCP Server先复现问题。本文将带领大家开发一个TCP Server自动化测试工具,TCP服务器收到Client发来的数据后立刻返回给该客户端。
一、基础知识
1.python网络编程简介
Python 提供了两个级别访问的网络服务。
1.1 低级别
低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。
1.2 高级别
高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。
2.TCP Server实现方式
理论上,使用低级别的网络服务和高级别的网络服务都可以实现此功能,低级别网络服务主要使用socket接口,开发TCP Server时候需要和多线程结合起来才能实现,主要示例代码如下,每次有新的客户端接入都需要创建一个线程处理。
import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 9998))
s.listen(3)
# 处理函数
def link(conn, addr):
data = conn.recv(1024).decode('utf-8')
conn.sendall(data.encode('utf-8'))
conn.close()
while True:
conn, addr = s.accept()
# 每次新开一个线程,处理客户端的请求
t = threading.Thread(target=link, args=(conn, addr))
t.start()
本文使用python的高级别的网络服务模块 SocketServer,具体实现参见下文。
二、使用实例
1.程序分析
# encoding= utf-8
import os
import socketserver
# tcp server
class MyTcpServer(socketserver.BaseRequestHandler):
def handle(self):
while True:
data = self.request.recv(1024).strip()
print ("##################receive from (%r):%r" % (self.client_address, data))
self.request.send( data )
host = ("192.168.1.6", 8089)
tcp_s = socketserver.ThreadingTCPServer(host, MyTcpServer)
tcp_s.serve_forever()
三、下载运行
运行python程序:
输入python3 run.py运行python程序,注意程序中IP地址修改为电脑的IP地址。
网络助手启动两个TCP客户端:
运行现象:
客户端分别向Python启动的TCP 服务端发送数据,会立刻收到服务器返回信息,网络助手信息如下:
python控制台运行信息如下:
四、结语
1.总结:
本节完,实际操作过程中需要注意的地方有如下几点:
(1) python版本
本文使用python3.6.0
(2) IP地址配置
IP地址选择电脑的IP地址,通过CMD控制台ipconfig查看获取,我这边是192.168.1.6。
2.后记:
如您在使用过程中有任何问题,请加QQ群进一步交流,也可以github提Issue。
QQ交流群:906015840 (备注:物联网项目交流)
github仓库地址:https://github.com/solitary-sand/python
一叶孤沙出品:一沙一世界,一叶一菩提