python服务器传输数据格式问题

我已经把数据上传到数据库,但是下发指令的时候出现了——什么一个非套接字上尝试了一个操作。求指教

img

import pymysql
import socket
import json
import threading
from select import select
from flask import Flask, request, jsonify
from flask_cors import CORS

# 打开数据库连接     
db = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    db='nongyedapeng',
    charset='utf8'
)          
cursor = db.cursor()

app = Flask(__name__)
CORS(app, resource=r'/*')  # 解决跨域问题

isChange = False

event = threading.Event


def hhhh():
    # 1.创建套接字 socket
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置为非阻塞模式
    server.setblocking(0)
    # 端口复用
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 2.绑定 bind
    server.bind(('10.23.20.237', 8234))
    # 3.监听 listen
    server.listen(5)

    print('starting...')

    # 设置关注列表
    # 初始化读取数据监听列表,最开始时希望从server这个套接字上读取数据。监听套接字:server 只有读操作,等待客户端连接
    rlist = [server]
    # 初始化写入数据的监听列表,最开始并没有客户端连接进来,所以列表为空
    wlist = []
    xlist = []

    while True:
        # 监控IO发生
        # select函数语法: rs,ws,xs=select(rlist, wlist, xlist[, timeout])
        # 提交监测我们关注的IO,阻塞等待IO发生
        rs, ws, xs = select(rlist, wlist, xlist)
        for r in rs:  # 遍历读列表(收到客户端请求的对象)
            if r is server:  # 分情况讨论,如果是监听套接字,说明由客户端连接服务端,做以下事情(只能读)
                # 接收连接
                c, client_addr = r.accept()  # #如果是server套接字对象接收到请求,则说明是新的用户连接
                print(client_addr)
                c.setblocking(0)
                rlist.append(c)  # 将新生成的套接字添加到读监听列表list中,让操作系统去监控
                wlist.append(c)
                header_dic = {'status': 'ok'}
                # header_json = json.dumps(header_dic)  # json格式的字符串
                # header_bytes = header_json.encode('utf-8')  # 将报头格式转换为bytes
                # c.send(header_bytes)tyggggg
                # print(header_bytes)
                print("连接响应成功")
            else:  # 如果不是server套接字对象接收的请求,则说明是已有的现成连接,以便保持持续的连接
                cmd = r.recv(1024).decode('utf-8')  # 接收客户端传过来的数据
                if not cmd:  # 如果没有发送过来任何数据
                    rlist.remove(r)  # 将当前套接字移除出rlist列表,使select不再监管此对象
                    r.close()  # 将当前套接字关闭
                else:
                    data_res = cmd
                    print(data_res)
                    result = json.loads(data_res)
                    print(result)
                    print(type(result))
                    temp = result.get('wendu')
                    hum = result.get('shidu')
                    lux = result.get('guangzhao')
                    aq = result.get('kongqizhiliang')
                    print(temp, hum, lux, aq)
                    cursor.execute("insert into data1(wendu,shidu,guangzhao,kongqizhiliang) values (\""
                                   + str(temp) + "\",\"" + str(hum) + "\",\"" + str(lux) + "\",\"" + str(aq) + "\")")
                    db.commit()  # 提交,使操作生效
                    print("add  successfully!")
                    print("接收到数据")
                    data_dic = {'status': 'okk'}
                    data_json = json.dumps(data_dic)  # json格式的字符串
                    data_bytes = data_json.encode('utf-8')  # 将报头格式转换为bytes
                    r.send(data_bytes)
                    print(data_bytes)
                    print(type(data_bytes))
                    print("发送数据响应成功")
            if isChange:
                for w in ws:
                    print(isChange)
                    cursor.execute("select wfazhidi,wfazhigao,sfazhidi,sfazhigao,gfazhidi,gfazhigao from threshold")
                    data = cursor.fetchone()
                    print("oh~")
                    if (data != None):
                        print("result:", data)
                        jsondata = {"wfazhigao": str(data[0]), "wfazhidi": str(data[1]), "sfazhigao": str(data[2]),
                                       "sfazhidi": str(data[3]), "gfazhigao": str(data[4]), "gfazhidi": str(data[5])}
                    postcmd_dic = {'data': {"apitag": "cmd", "wfazhigao": str(data[0]), "wfazhidi": str(data[1]),
                                               "sfazhigao": str(data[2]), "sfazhidi": str(data[3]),
                                               "gfazhigao": str(data[4]),
                                               "gfazhidi": str(data[5])}}
                    postcmd_json = json.dumps(postcmd_dic)  # json格式的字符串
                    postcmd_bytes = postcmd_json.encode('utf-8')  # 将报头格式转换为bytes
                    r.send(postcmd_bytes)
                    print(postcmd_bytes)
                    print("命令下发成功")
                    precmd_dic = {'status': 'finish'}
                    precmd_json = json.dumps(precmd_dic)  # json格式的字符串
                    precmd_bytes = precmd_json.encode('utf-8')  # 将报头格式转换为bytes
                    r.send(precmd_bytes)
                    print(precmd_bytes)
                    print("命令已经全部发送")

            for x in xs:
                pass

代码放全点

主要是看你的r是什么,才能知道

你代码的"rs, ws, xs = select(rlist, wlist, xlist)"这一行,实际上是:

readable, writable, exceptional = select.select(inputs, outputs, inputs)

你既然都遍历ws了,为什么不写 w.send()
给你个参考链接: