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 相关文章推荐
Django查找网站项目根目录和对正则表达式的支持
Jul 15 Python
Python脚本实现自动发带图的微博
Apr 27 Python
Python实现包含min函数的栈
Apr 29 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
python在OpenCV里实现投影变换效果
Aug 30 Python
python批量处理文件或文件夹
Jul 28 Python
python plotly画柱状图代码实例
Dec 13 Python
Python3 assert断言实现原理解析
Mar 02 Python
python模块内置属性概念及实例
Feb 18 Python
Python一行代码实现自动发邮件功能
May 30 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 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
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
PHP SOCKET编程详解
2015/05/22 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
jQuery 性能优化指南 (1)
2009/05/21 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
javascript操作符"!~"详解
2015/02/10 Javascript
jquery实现漂亮的二级下拉菜单代码
2015/08/26 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
微信小程序实现顶部选项卡(swiper)
2020/06/19 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
浅谈vue路径优化之resolve
2017/10/13 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
python解决字典中的值是列表问题的方法
2013/03/04 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
Python求解正态分布置信区间教程
2019/11/20 Python
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
什么是数据抽象
2016/11/26 面试题
Linux如何为某个操作添加别名
2015/02/05 面试题
小学教师的个人自我鉴定
2013/10/24 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript