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简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
python&MongoDB爬取图书馆借阅记录
Feb 05 Python
python使用fcntl模块实现程序加锁功能示例
Jun 23 Python
python实现转圈打印矩阵
Mar 02 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
pandas实现将日期转换成timestamp
Dec 07 Python
Python标准库itertools的使用方法
Jan 17 Python
将tensorflow模型打包成PB文件及PB文件读取方式
Jan 23 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
jupyter notebook读取/导出文件/图片实例
Apr 16 Python
使用Python解析Chrome浏览器书签的示例
Nov 13 Python
Python实现自动玩连连看的脚本分享
Apr 04 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
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
php数组的概述及分类与声明代码演示
2013/02/26 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
javascript中的继承实例代码
2011/04/27 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
剖析Python的Twisted框架的核心特性
2016/05/25 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
python中如何使用insert函数
2020/01/09 Python
零基础学python应该从哪里入手
2020/08/11 Python
python图片合成的示例
2020/11/09 Python
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
入学申请自荐信范文
2014/02/26 职场文书
《高尔基和他的儿子》教学反思
2014/04/09 职场文书
环保志愿者活动总结
2014/06/27 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
1000字打架检讨书
2014/11/03 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书