IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> python epoll_tcp连接实现设备上传下发指令 -> 正文阅读

[网络协议]python epoll_tcp连接实现设备上传下发指令

1.思路
接收设备的数据:写一个tcp服务器,设备主动连接的时候会发出数据,通过服务器接受到的数据进行转发,业务层去解析即可。
主动下发指令:需要写一个tcp服务器和tcp客户端,当设备来数据的肯定会带有设备的唯一标识,例如设备号、设备id等,接到设备数据后把设备号解析出来与本次连接进行绑定,存到缓存中以便主动下发指令的精准找到设备连接,把客户端作为一个rest服务,当我们主动下发指令的时候调用这个rest服务,这时候下发的指令数据中带有设备号,通过设备号精确的找到下发指令的设备,来实现下发。
2.代码
客户端


import json
import socket
from flask import Flask, request
server = Flask(__name__)
@server.route("/push",methods=['post'])
def main():

    # 1 创建tcp套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2 创建连接
    tcp_socket.connect(('127.0.0.1', 6666))

    # 3 发送数据
    data = json.loads(request.data)
    tcp_input = request.data
    tcp_socket.send(tcp_input)  # utf-8 中文会乱码

    # 4.关闭套接字
    tcp_socket.close()
    return ""
if __name__ == '__main__':
    # test()
    server.run(host="0.0.0.0",port=8787, debug=True)

服务端

import binascii
import json
import socket
from flask import Flask, request
import select
import redis
server = Flask(__name__)
# 内存
redis = redis.Redis(host='127.0.0.1', port=6379,db=0)
# 创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 设置可以重复使用绑定的信息
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

# 绑定本机信息
s.bind(("",6666))

# 变为被动
s.listen(10)

# 创建一个epoll对象
epoll=select.epoll()

# 测试,用来打印套接字对应的文件描述符
# print s.fileno()
# print select.EPOLLIN|select.EPOLLET

# 注册事件到epoll中
# epoll.register(fd[, eventmask])
# 注意,如果fd已经注册过,则会发生异常
# 将创建的套接字添加到epoll的事件监听中
epoll.register(s.fileno(),select.EPOLLIN|select.EPOLLET)


connections = {}
addresses = {}
# 循环等待客户端的到来或者对方发送数据
while True:

    # epoll 进行 fd 扫描的地方 -- 未指定超时时间则为阻塞等待
    epoll_list=epoll.poll()

    # 对事件进行判断
    for fd,events in epoll_list:

        # print fd
        # print events

        # 如果是socket创建的套接字被激活
        if fd == s.fileno():
            conn,addr=s.accept()

            print('有新的客户端到来%s'%str(addr))

            # 将 conn 和 addr 信息分别保存起来
            connections[conn.fileno()] = conn
            addresses[conn.fileno()] = addr
            print("conn.fileno()%s"%str(conn.fileno()))

            # 向 epoll 中注册 连接 socket 的 可读 事件
            epoll.register(conn.fileno(), select.EPOLLIN | select.EPOLLET)


        elif events == select.EPOLLIN:
            # 从激活 fd 上接收下发
            recvData = connections[fd].recv(1024)
            print('连接%s'%str(fd))
            if len(recvData)>0:
                print('recv:%s'%recvData)
                issued = {}
                try:
                    issued = recvData.decode(encoding='utf-8',errors='strict')
                except Exception:
                    print("自动")
                finally:
                    number = ''
                    if 'number' in issued:
                        print(issued)
                        issued = json.loads(issued)
                        print(issued)
                        # number = issued.get('number')
                        number = issued['number']
                        print(number)
                        fd2 = redis.get(str(number))
                        print(fd2)
                        content = '2000'
                        fd2 = fd2.decode(encoding='utf-8', errors='strict')
                        connections[int(fd2)].send(content.encode("utf-8"))
                    else:
                        data = binascii.b2a_hex(recvData)
                        print(data)
                        data = data.decode(encoding ='utf-8',errors = 'strict')
                        tou = '7a7a'
                        if tou in data:
                            numberKey = data[4:14]
                            redis.set(numberKey,fd)
                        print(data)
                        content = '200'
                        print('打印number'+number)
                        connections[fd].send(content.encode("utf-8"))
            else:
                # 从 epoll 中移除该 连接 fd
                epoll.unregister(fd)

                # server 侧主动关闭该 连接 fd
                connections[fd].close()

                print("%s---offline---"%str(addresses[fd]))



写的不好将就看吧,可以留言一起学习。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 12:13:42  更:2021-08-27 12:14:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:28:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码