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程序来判断文本的语种
Apr 07 Python
PyQt5固定窗口大小的方法
Jun 18 Python
python命令行参数用法实例分析
Jun 25 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
Jul 04 Python
Python中Unittest框架的具体使用
Aug 27 Python
DJANGO-URL反向解析REVERSE实例讲解
Oct 25 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
python Django框架实现web端分页呈现数据
Oct 31 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
Python暴力破解Mysql数据的示例
Nov 09 Python
Python安装使用Scrapy框架
Apr 12 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
javascript的动态加载、缓存、更新以及复用(一)
2014/06/09 Javascript
JavaScript获取表单内所有元素值的方法
2015/04/02 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
JS常用倒计时代码实例总结
2017/02/07 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
详解mpvue开发小程序小总结
2018/07/25 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
this在vue和小程序中的使用详解
2019/01/28 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
Python list运算操作代码实例解析
2020/01/20 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
药品营销专业毕业生自荐信
2014/07/02 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
公司授权委托书样本
2014/09/15 职场文书
科学育儿宣传标语
2014/10/08 职场文书
python实现监听键盘
2021/04/26 Python
Go 自定义package包设置与导入操作
2021/05/06 Golang
Nginx源码编译安装过程记录
2021/11/17 Servers
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android