有时出现乱码的结果通过TCP套接字从python发送base64编码图像到node.js

我试图通过程序在python中生成图像以发送到node.js实例,然后我可以通过websocket实时将这些图像发送到浏览器。

我的第一个testing迭代只是在我的node.js服务器中打开一个jpeg文件,将其编码为base64,并使用socket.io(端口81)将其发送到浏览器。 每次发送数据都能正常工作。

然后,我尝试在python中打开相同的文件,连接到一个原始的TCP node.js服务器(在端口9090上),并将文件发送到节点服务器,以便转发给浏览器(在端口81上)。 大约一半的时间,数据节点接收似乎被破坏,但数据python从文件读取每次都罚款。

令我惊讶的是,节点和浏览器之间的数据通道是好的,但是Python和节点之间的数据通道却不是。 websockets是否提供了一些在原始TCP套接字中不存在的纠错? 如果不是,可能会导致这个错误?

谢谢。

JS代码

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 

不pipe在tcp套接字的客户端有多less个写操作,以及你通常无法控制的数据块的大小,你将在serever的'data'处理器上得到什么样的大小(tcp只能保证它们是有序的)。 您需要手动构build数据(最简单的方法是使用帧大小前缀并caching传入的数据)

也请看这个问题