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

2 投票
1 回答
1878 浏览
提问于 2025-04-16 21:16

我正在尝试用Python程序生成图片,然后把这些图片发送到一个node.js的实例,这样我就可以通过websocket实时把这些图片传送到浏览器。

我第一次测试的时候,简单地在我的node.js服务器上打开一个jpeg文件,把它编码成base64格式,然后通过socket.io发送到浏览器(使用81端口)。每次发送数据的时候,这个方法都能正常工作。

接着我尝试在Python中打开同一个文件,连接到一个原始的TCP node.js服务器(使用9090端口),然后把文件发送到node服务器,让它转发给浏览器(使用81端口)。但大约一半的时间,node接收到的数据似乎是损坏的,而Python从文件中读取的数据每次都是正常的。

让我感到惊讶的是,node和浏览器之间的数据通道是正常的,但Python和node之间却不行。难道是因为websocket提供了一些错误修正的功能,而原始的TCP socket没有吗?如果不是,那可能是什么原因导致这个错误呢?

谢谢。

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

1 个回答

2

无论你在TCP套接字的客户端写了多少次数据,消息的大小是什么,你通常无法控制在服务器的“数据”处理器中接收到的数据块的大小(TCP只保证数据是按顺序到达的)。你需要手动给你的数据加上边界(最简单的方法是先加上数据的大小,然后再缓冲接收到的数据)。

另外,可以参考这个问题

撰写回答