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中用Spark模块的使用教程
Apr 13 Python
python实现将元祖转换成数组的方法
May 04 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
django之常用命令详解
Jun 30 Python
Python KMeans聚类问题分析
Feb 23 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
Mar 05 Python
python实现点击按钮修改数据的方法
Jul 17 Python
Django admin组件的使用
Oct 24 Python
python装饰器代码深入讲解
Mar 01 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 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
xml+php动态载入与分页
2006/10/09 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
PHP二维数组去重算法
2016/12/17 PHP
用JavaScript实现UrlEncode和UrlDecode的脚本代码
2008/07/23 Javascript
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
jquery对象和DOM对象的区别介绍
2013/08/09 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
JavaScript模拟实现自由落体效果
2018/08/28 Javascript
Vue基础学习之项目整合及优化
2019/06/02 Javascript
ant design实现圈选功能
2019/12/17 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
python和shell变量互相传递的几种方法
2013/11/20 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
伦敦一卡通:The London Pass
2018/11/30 全球购物
标准的毕业生自荐信
2014/04/20 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
法制宣传月活动总结
2014/04/29 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
演讲开场白和结束语
2015/05/29 职场文书
Python基础 括号()[]{}的详解
2021/11/07 Python
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL