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读取Android permission文件
Nov 01 Python
下载给定网页上图片的方法
Feb 18 Python
Python迭代和迭代器详解
Nov 10 Python
python将ansible配置转为json格式实例代码
May 15 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
Django使用paginator插件实现翻页功能的实例
Oct 24 Python
PyCharm代码提示忽略大小写设置方法
Oct 28 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
Jan 10 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 Python
Django3中的自定义用户模型实例详解
Aug 23 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中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
将数组写入txt文件 var_export
2009/04/21 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
Div自动滚动到末尾的代码
2008/10/26 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
2016/12/08 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
python中定义结构体的方法
2013/03/04 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
Python使用sorted排序的方法小结
2017/07/28 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
开业庆典邀请函
2014/01/08 职场文书
运动会演讲稿100字
2014/08/25 职场文书
群众路线组织生活会发言材料
2014/10/17 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
2015年体育教学工作总结
2015/05/20 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
简单介绍Python的第三方库yaml
2021/06/18 Python