我正在尝试在python中程序生成图像以发送到node.js实例,因此我可以通过websocket将这些图像实时传递给浏览器。
我的第一个测试迭代只是在我的node.js服务器中打开一个jpeg文件,将其编码为base64,并使用套接字将其发送给浏览器。IO(端口81)。每次发送数据时,都可以正常工作。
然后我尝试用python打开相同的文件,连接到原始TCP node.js服务器(端口9090),并将文件发送到节点服务器,以便将其转发到浏览器(端口81)。大约有一半的时间,数据节点接收到的数据似乎是坏的,但是python每次从文件中读取的数据都是好的。
让我惊讶的是node和浏览器之间的数据通道是正常的,而python和node之间的数据通道却不是。websockets是否提供了一些原始TCP套接字中不存在的错误纠正?如果不是,是什么导致了这个错误?
谢谢。<<p> JS代码/strong>
var io = require('socket.io').listen(81);
var fs = require('fs');
var path = require('path');
var net = require('net');
var mousex = 0;
var mousey = 0;
var imgdata = "";
var oldimgdata = "";
var imagehaschanged = true;
//Serving python
var server = net.createServer(function (stream) {
stream.setEncoding("base64");
stream.on("connect", function () {
console.log("rendering client connected");
});
stream.on("data", function (data) {
//parsed = JSON.parse(data);
imgdata = data;
preview = imgdata.substr(0,50);
console.log(preview);
if (imgdata!=oldimgdata) {
imagehaschanged=true;
}
console.log("rendering client sent data:");
posdata = JSON.stringify({'x':mousex ,'y':mousey});
stream.write(posdata, "ascii", function() {
console.log("Sent response");
});
});
stream.on("end", function () {
stream.end();
console.log("rendering client closed connection");
});
});
server.listen(9090);
//Serving web
io.sockets.on('connection', function (socket) {
socket.emit('ready');
socket.on('position', function(data){
mousex = data.x;
mousey = data.y;
if (imagehaschanged) {
socket.emit('image', {data: imgdata});
oldimgdata = imgdata;
imagehaschanged = false;
}
//fs.readFile("1.jpg", processRead);
//console.log(data.x + ", " + data.y)
});
});
Python代码
import socket, json,# base64
from time import sleep, time
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 9090))
while 1:
t0 = time()
f = open("1.jpg")
data = f.read()
f.close()
imgdata = data # base64.b64encode(data)
print imgdata[:50]
len = s.send(imgdata)
response = json.loads(s.recv(4096))
print "Response is:", response
sleep(2)
print "Time taken is: ", time()-t0
无论TCP套接字的客户端写了多少,消息的大小如何,您通常无法控制服务器'data'处理程序上的数据块的大小(TCP只保证它们是有序的)。您需要手动设置数据帧(最简单的方法是使用帧大小作为前缀并缓冲传入数据)
参见this question