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实现微信发送邮件关闭电脑功能
Feb 22 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
Python语言快速上手学习方法
Dec 14 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
Python 从subprocess运行的子进程中实时获取输出的例子
Aug 14 Python
Django使用Profile扩展User模块方式
May 14 Python
Python基于gevent实现高并发代码实例
May 15 Python
基于logstash实现日志文件同步elasticsearch
Aug 06 Python
python批量修改交换机密码的示例
Sep 22 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 14 Python
python playwright 自动等待和断言详解
Nov 27 Python
Python pyecharts绘制条形图详解
Apr 02 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
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
Python中使用PIPE操作Linux管道
2015/02/04 Python
Python调用C语言开发的共享库方法实例
2015/03/18 Python
Python实现的密码强度检测器示例
2017/08/23 Python
Python数据类型之Tuple元组实例详解
2019/05/08 Python
wxPython实现文本框基础组件
2019/11/18 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
《开国大典》教学反思
2014/04/19 职场文书
省文明单位申报材料
2014/05/08 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
党员民主评议自我评价
2014/10/20 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android
Python必备技巧之函数的使用详解
2022/04/04 Python