【问题标题】:Sometimes garbled results sending base64 encoded images over TCP socket from python to node.js有时,通过 TCP 套接字从 python 到 node.js 发送 base64 编码图像的结果会出现乱码
【发布时间】:2011-10-02 19:58:27
【问题描述】:

我正在尝试在 python 中以程序方式生成图像以发送到 node.js 实例,因此我可以通过 websocket 将这些图像实时传送到浏览器。

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

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

让我惊讶的是node和浏览器之间的数据通道很好,而python和node之间的数据通道却不是。 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

【问题讨论】:

  • 奇怪!您能否尝试使用 tcpdump 窥探传输中的数据,以查看它在那时是否已损坏?这至少应该告诉您问题出在 python 还是 node.js 中。

标签: python sockets node.js tcp websocket


【解决方案1】:

无论 tcp 套接字的客户端有多少写入以及消息的大小是多少,您通常无法控制您将在服务器的“数据”处理程序上获得的数据块的大小(tcp 只保证它们在命令)。您需要手动构建数据(最简单的方法是使用帧大小作为前缀并缓冲传入数据)

另见this question

【讨论】:

  • 我决定尝试让我的 python 代码与 socket.io 服务器而不是原始服务器通信。感谢您为我指明正确的方向
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 2021-04-16
  • 2020-02-17
相关资源
最近更新 更多