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实现文件快照加密保护的方法
Jun 30 Python
python如何通过protobuf实现rpc
Mar 06 Python
利用python程序生成word和PDF文档的方法
Feb 14 Python
浅谈Django REST Framework限速
Dec 12 Python
python脚本生成caffe train_list.txt的方法
Apr 27 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
python 高效去重复 支持GB级别大文件的示例代码
Nov 08 Python
5分钟 Pipenv 上手指南
Dec 20 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
Jun 29 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扩展函数
2006/10/09 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
PHP的pcntl多进程用法实例
2015/03/19 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
Gird事件机制初级读本
2007/03/10 Javascript
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
python交互式图形编程实例(二)
2017/11/17 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
python 用所有标点符号分隔句子的示例
2019/07/15 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
用Python 执行cmd命令
2020/12/18 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
总务岗位职责
2013/11/19 职场文书
简历自我评价怎么写呢?
2014/01/06 职场文书
2015年采购员工作总结
2015/04/27 职场文书
起诉书格式范文
2015/05/20 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
简爱读书笔记
2015/06/26 职场文书