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实现远程调用MetaSploit的方法
Aug 22 Python
Python3.遍历某文件夹提取特定文件名的实例
Apr 26 Python
Python实现的微信好友数据分析功能示例
Jun 21 Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 Python
python 异或加密字符串的实例
Oct 14 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
django之自定义软删除Model的方法
Aug 14 Python
python 求10个数的平均数实例
Dec 16 Python
Python-opencv 双线性插值实例
Jan 17 Python
pyecharts在数据可视化中的应用详解
Jun 08 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 Python
Python中with上下文管理协议的作用及用法
Mar 18 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
基于PHP遍历数组的方法汇总分析
2013/06/08 PHP
php中的Base62类(适用于数值转字符串)
2013/08/12 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
2014/12/22 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
微信小程序 底部导航栏目开发资料
2016/12/05 Javascript
详解react使用react-bootstrap当轮子造车
2017/08/15 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
Python pass详细介绍及实例代码
2016/11/24 Python
Python生成随机密码的方法
2017/06/16 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
餐厅总经理岗位职责
2013/12/31 职场文书
2014年幼儿园植树节活动方案
2014/03/02 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
北京英语导游词
2015/02/12 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers