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解析xml成对应的html示例分享
Apr 02 Python
Python中__call__用法实例
Aug 29 Python
Python多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 Python
Python实现的读取文件内容并写入其他文件操作示例
Apr 09 Python
使用Python打造一款间谍程序的流程分析
Feb 21 Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 Python
Python必须了解的35个关键词
Jul 16 Python
python使用列表的最佳方案
Aug 12 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 Python
Python find()、rfind()方法及作用
Dec 24 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/03 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
解决echarts数据二次渲染不成功的问题
2020/07/20 Javascript
Python批量修改文件后缀的方法
2014/01/26 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
python对excel文档去重及求和的实例
2018/04/18 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
基于Python实现天天酷跑功能
2021/01/06 Python
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
市场营销个人求职信范文
2014/02/02 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
会计专业自荐信
2014/06/03 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书