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 调用VC++的动态链接库(DLL)
Sep 06 Python
python中Flask框架简单入门实例
Mar 21 Python
Python聚类算法之DBSACN实例分析
Nov 20 Python
Python的math模块中的常用数学函数整理
Feb 04 Python
Python简单实现enum功能的方法
Apr 25 Python
使用Python的Tornado框架实现一个Web端图书展示页面
Jul 11 Python
python安装Scrapy图文教程
Aug 14 Python
Python实现的计数排序算法示例
Nov 29 Python
Python数据结构与算法之字典树实现方法示例
Dec 13 Python
Python中断多重循环的思路总结
Oct 04 Python
基于Django实现日志记录报错信息
Dec 17 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 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接口和抽象类使用示例详解
2014/03/02 PHP
php跨服务器访问方法小结
2015/05/12 PHP
php实现将Session写入数据库
2015/07/26 PHP
php实现用户登陆简单实例
2017/04/04 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
精通Javascript系列之数值计算
2011/06/07 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
jQuery中focus事件用法实例
2014/12/26 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
Vue 中批量下载文件并打包的示例代码
2017/11/20 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
[01:07:53]RNG vs VG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
python和C语言混合编程实例
2014/06/04 Python
Django权限机制实现代码详解
2018/02/05 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
python找出因数与质因数的方法
2019/07/25 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
新闻专业个人求职信
2013/12/19 职场文书
生产部岗位职责范文
2014/02/07 职场文书
交通文明倡议书
2014/05/16 职场文书
有关环保的标语
2014/06/13 职场文书
员工升职自荐信
2015/03/27 职场文书
小学生运动会广播
2015/08/19 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis