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