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 os模块中的isfile()和isdir()函数均返回false问题解决方法
Feb 04 Python
Python中的自省(反射)详解
Jun 02 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
pyttsx3实现中文文字转语音的方法
Dec 24 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
python判断所输入的任意一个正整数是否为素数的两种方法
Jun 27 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
Pandas操作CSV文件的读写实现方法
Nov 13 Python
通过实例解析python and和or使用方法
Nov 14 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 Python
Python爬取网站图片并保存的实现示例
Feb 26 Python
详解Python中__new__方法的作用
Mar 31 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 数组黑名单/白名单实例代码详解
2019/06/04 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
简单的js分页脚本
2009/05/21 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
javascript 获取元素样式必杀技
2014/05/04 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#‘的解决方法
2017/06/17 Javascript
详解vue axios中文文档
2017/09/12 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
Python全排列操作实例分析
2018/07/24 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
python+flask实现API的方法
2018/11/21 Python
如何用C代码给Python写扩展库(Cython)
2019/05/17 Python
python3的url编码和解码,自定义gbk、utf-8的例子
2019/08/22 Python
python连接mysql有哪些方法
2020/06/24 Python
利用python绘制正态分布曲线
2021/01/04 Python
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
经典而简洁的婚礼主持词
2014/03/13 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
优秀求职信
2014/05/29 职场文书
停发工资证明范本
2015/06/12 职场文书
运动会班级前导词
2015/07/20 职场文书
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
docker-compose部署Yapi的方法
2022/04/08 Servers
Python matplotlib多个子图绘制整合
2022/04/13 Python
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS