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中的魔法方法深入理解
Jul 09 Python
Python编程中的文件读写及相关的文件对象方法讲解
Jan 19 Python
基于python神经卷积网络的人脸识别
May 24 Python
Flask入门之上传文件到服务器的方法示例
Jul 18 Python
Python编程中flask的简介与简单使用
Dec 28 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 Python
Python 利用高德地图api实现经纬度与地址的批量转换
Aug 14 Python
Python实现朴素贝叶斯的学习与分类过程解析
Aug 24 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
Python实现转换图片背景颜色代码
Apr 30 Python
如何理解python对象
Jun 21 Python
Python urllib request模块发送请求实现过程解析
Dec 10 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
php echo 输出字符串函数详解
2010/05/13 PHP
php 发送带附件邮件示例
2014/01/23 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
javascript 冒号 使用说明
2009/06/06 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
在百度知道团队中快速审批新成员的js脚本
2014/02/02 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
2017/04/07 Javascript
JS实现身份证输入框的输入效果
2017/08/21 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
vue权限问题的完美解决方案
2019/05/08 Javascript
vue实现分页加载效果
2019/12/24 Javascript
VUE动态生成word的实现
2020/07/26 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
Python下Fabric的简单部署方法
2015/07/14 Python
Python中%是什么意思?python中百分号如何使用?
2018/03/20 Python
python Django的web开发实例(入门)
2019/07/31 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
pytorch梯度剪裁方式
2020/02/04 Python
python解包用法详解
2021/02/17 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
安全在我心中演讲稿
2014/09/01 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
入党转正申请书范文
2019/05/20 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL