这是我到目前为止开发的。首先,我的websocket服务器:
// app.js
const spawn = require('child_process');
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })
wss.on('connection',ws => {
ws.on('message', message => {
const python = spawn('python', ['-u', 'main.py', message])
python.stdout.on('data', function (data) {
// Pipe data from python script ...
dataToSend = data.toString('utf8');
ws.send(dataToSend)
});
python.on('error', err => {
console.log(err)
})
})
ws.on('close', () => {
console.log('Client has disconected')
})
}).on('error', err => {
console.log(err)
})
它的基本用法是使用child_process
生成一个Python脚本,该脚本传递从客户端发送的message
。
传递-u
是为了刷新python脚本打印,因此可以在python.stdout
上将其流式传输并发送给客户端。
这是从app.js websocket服务器调用的python脚本:
# main.py
import time, sys
i = int(sys.argv[1])
while i > 0:
print(i)
i-=1
time.sleep(1)
# this while is just anexemple of some pre-script process
# (for exemple, signin on user account)
# after signin...
print('input something from client: ')
x = input()
while True:
print(x)
time.sleep(1)
# use input x variable
# here is where my code happens and the program keeps executing
pass
如您所见,我正在使用从服务器传递到message
的{{1}}来保持我的第一个spawn()
的生命。只是一个例子,我需要用户的这种输入。
请注意while
,因为这是我的主要问题
最后,我的客户网络套接字
x = input()
基本知识会传递第一个参数// client.js
const WebSocket = require('ws');
let socket = new WebSocket("ws://localhost:8080");
socket.onopen = function(e) {
let someClientInfo = 2
console.log("sending data...");
socket.send(someClientInfo);
};
socket.onmessage = function(event) {
console.log('Output of python script: ' + event.data.toString('utf-8'));
};
socket.onerror = function(event) {
console.log(event);
};
,然后接收python脚本输出,如下所示:
someClientInfo
当然,当客户收到最后一行时,由于他无法从他的侧面输入任何东西,它总是会卡住。他只是从python接收输出流。
有人知道是否有可能将第二个输入传递给我正在运行的python脚本吗?我开始认为也许这是不可能的,但是我不能以另一种方式做到这一点。如果sending data...
Output of python script: 2
Output of python script: 1
Output of python script: input something from client:
无法做到,那我应该寻找什么方式?
我的主要目的是与服务器上运行的python脚本保持实时通信,因此我可以将此输入从客户端传递给python。
我希望能够从此套接字断开连接,然后再次连接并继续接收python脚本输出。到目前为止,我也找不到办法。
我的主脚本不能放在服务器代码中(也许如果您对flask的基本实现有所了解),因为我希望能够启动多个脚本,并且每个客户端用户都应该能够继续在服务器上运行自己的python脚本进行编辑。每个用户都有自己的child_process
到目前为止,我还没有对如何保持所有这些进程在服务器上运行,甚至可以安全地进行这样的事情保持坚决态度。关于此的任何建议将非常感激,我也将非常感谢。