Python实现多线程/多进程的TCP服务器


Posted in Python onSeptember 03, 2019

多线程的TCP服务器,供大家参考,具体内容如下

背景:同学公司的传感器设备需要将收集的数据发到服务器上,前期想写一个简单的服务器来测试下使用效果,设备收集的数据非常的重要,所以考虑使用TCP协议来实现。

因为只是测试使用,所以采用多线程的方式,毕竟节省资源嘛(使用协程时会导致I/O阻塞)

开门见山,直接搬上来了

一、tcp_server_v1.0使用说明:

1.运行环境:python3解释器,并安装socket、threading模块;
2.该版本使用多线程实现的多任务;
3.支持多台设备同时连接,并同时提供服务。

二、代码逻辑:

指定服务器运行端口为:8125
创建一个服务器类
实例化一个服务器对象
服务器对象调用类中的方法

1 初始化服务器属性(def __init__)

1.1 创建套接字
1.2 解决程序端口占用问题
1.3 绑定本地ip地址
1.4 将套接字变为监听套接字,最大连接数量为100

2 定义设备连接方法(def run_forever)

2.1 进入循环
2.2 等待设备连接...
     2.2.1 当设备连接,打印设备的 ip 和 port
     2.2.2 创建线程,调用业务处理方法,为该设备提供服务

3 业务处理方法(def service_machine)

3.1 进入循环
3.2 等待接收设备发送数据... 

3.2.1 当服务器接收到数据
3.2.2 判断数据是否为空
          否:打印数据内容,进行业务处理,将处理后的数据结果返回给设备
          是:打印设备断开连接,退出循环,关闭套接字

代码实现如下:

#!C:\Python3.6.5\python.exe
# -*- coding: gbk -*-

import socket
import threading

class WSGIServer(object):
 def __init__(self, port):
 """初始化对象"""
 # 创建套接字
 self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 # 解决程序端口占用问题
 self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 # 绑定本地ip地址
 self.tcp_server_socket.bind(("", port))
 # 将套接字变为监听套接字,最大连接数量为100
 self.tcp_server_socket.listen(100)

 def run_forever(self):
 """设备连接"""
 while True:
 # 1.等待设备连接(通过ip地址和端口建立tcp连接)
 # 如果有设备连接,则会生成用于设备和服务器通讯的套接字:new_socket
 # 会获取到设备的ip地址和端口
 new_socket, client_addr = self.tcp_server_socket.accept()
 print("设备{0}已连接".format(client_addr))

 # 2.创建线程处理设备的需求
 t1 = threading.Thread(target=self.service_machine, args=(new_socket, client_addr))
 t1.start()

 def service_machine(self, new_socket, client_addr):
 """业务处理"""
 while True:
 # 3.接收设备发送的数据,单次最大1024字节,按‘gbk'格式解码
 receive_data = new_socket.recv(1024).decode("gbk")
 # 4.如果设备发送的数据不为空
 if receive_data:
 # 4.1 打印接收的数据,这里可以将设备发送的数据写入到文件中
 # 获取设备的ID信息
 print(receive_data)
 if receive_data[0:6] == "report":
  response = "SET OK:" + receive_data
 else:
  receive_data = receive_data[6:].split(",")[0]
  # 拼接响应数据
  response = "alarm=" + receive_data + ",Switch:clear"
 print(response)
 # 4.2 返回原数据作为应答,按‘utf-8'格式编码
 new_socket.send(response.encode("utf-8"))
 # 5.当设备断开连接时,会收到空的字节数据,判断设备已断开连接
 else:
 print('设备{0}断开连接...'.format(client_addr))
 break

 # 关闭套接字
 new_socket.close()


def main(port):
 """创建一个WEB服务器"""
 wsgi_server = WSGIServer(port)
 print("服务器已开启")
 wsgi_server.run_forever()



if __name__ == '__main__':
 port = 8125 # 指定端口
 main(8125)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 打印对象的所有属性值的方法
Sep 11 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
Python实现遍历目录的方法【测试可用】
Mar 22 Python
PyQt5实现下载进度条效果
Apr 19 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
使用Pandas的Series方法绘制图像教程
Dec 04 Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 Python
python实现读取类别频数数据画水平条形图案例
Apr 24 Python
PyTorch在Windows环境搭建的方法步骤
May 12 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 Python
python+selenium 点击单选框-radio的实现方法
Sep 03 #Python
使用OpCode绕过Python沙箱的方法详解
Sep 03 #Python
python实现单链表的方法示例
Sep 03 #Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 #Python
python网络编程之多线程同时接受和发送
Sep 03 #Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 #Python
python生成随机红包的实例写法
Sep 02 #Python
You might like
深入解析PHP垃圾回收机制对内存泄露的处理
2013/06/14 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
php隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
用jscript实现新建word文档
2007/06/15 Javascript
JavaScript 高效运行代码分析
2010/03/18 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
jQuery EasyUI API 中文文档 - Panel面板
2011/09/30 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
2018/12/14 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
vue自定义正在加载动画的例子
2019/11/14 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
python脚本设置系统时间的两种方法
2016/02/21 Python
python类的继承实例详解
2017/03/30 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
python db类用法说明
2020/07/07 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
英国网上超市:Ocado
2020/03/05 全球购物
会计电算化专业毕业生推荐信
2013/12/24 职场文书
酒店节能降耗方案
2014/05/08 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
董事长助理岗位职责
2015/02/11 职场文书
全国助残日活动总结
2015/05/11 职场文书