有时,通过TCP套接字将base64编码的图像从python发送到节点.js

2024-10-01 02:24:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用python程序化地生成图像以发送到节点.js实例,这样我就可以通过websocket将这些图像实时发送到浏览器。在

我的第一个测试迭代只是在节点.js服务器,将其编码为base64,并使用插座.io(在端口81上)。每次发送数据时,这种方法都很有效。在

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

令我惊讶的是,node和browser之间的数据通道很好,而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代码

^{pr2}$

Tags: io服务器logdatastream节点onvar
1条回答
网友
1楼 · 发布于 2024-10-01 02:24:26

不管在tcp套接字的客户端有多少次写入,以及消息的大小,您通常无法控制serever的“data”处理程序(tcp只保证它们是有序的)上获得的数据块的大小。您需要手动设置数据帧(最简单的方法是以帧大小作为前缀并缓冲传入数据)

另请参见this question

相关问题 更多 >