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中unittest用法实例
Sep 25 Python
零基础写python爬虫之打包生成exe文件
Nov 06 Python
python读取文本中的坐标方法
Oct 14 Python
python实现蒙特卡罗方法教程
Jan 28 Python
Python中捕获键盘的方式详解
Mar 28 Python
python的常见矩阵运算(小结)
Aug 07 Python
python selenium 执行完毕关闭chromedriver进程示例
Nov 15 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
Feb 25 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
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
图片翻转效果具体实现代码
2014/01/09 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
2015/06/08 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
js html实现计算器功能
2018/11/13 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
js实现轮播图特效
2020/05/28 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
Python中的生成器和yield详细介绍
2015/01/09 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
python中kmeans聚类实现代码
2018/02/23 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
教育学习自我评价
2014/02/03 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
总结会主持词
2015/07/02 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
python 实现两个变量值进行交换的n种操作
2021/06/02 Python
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS