Иногда искажаются результаты отправки изображений в кодировке base64 через сокет TCP из python в node.js - PullRequest
2 голосов
/ 11 июля 2011

Я пытаюсь процедурно сгенерировать изображения на python для отправки в экземпляр node.js, чтобы затем я мог доставлять эти изображения в реальном времени в браузер через веб-сокет.

Моей первой тестовой итерацией было просто открыть файл jpeg на моем сервере node.js, кодировать его в base64 и отправить его в браузер с помощью socket.io (на порту 81). Это работало нормально каждый раз при отправке данных.

Затем я попытался открыть тот же файл в python, подключиться к необработанному TCP-серверу node.js (на порт 9090) и отправить файл на сервер узлов для его пересылки в браузер (на порт 81). Примерно в половине случаев прием данных, кажется, не работает, но 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

1 Ответ

2 голосов
/ 11 июля 2011

независимо от того, сколько записей было на стороне клиента tcp-сокета и какие размеры сообщений у вас обычно не контролируются размерами блоков данных, которые вы получите в обработчике 'data' сервера (только tcp гарантирует, что онипорядок).Вам необходимо скомпоновать свои данные вручную (самый простой способ - поставить префикс с размером кадра и буферизовать входящие данные)

см. Также этот вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...