Как отправить изображение с [клиент Python] на [сервер node.js] с помощью сокета tcp? - PullRequest
0 голосов
/ 21 сентября 2019

Я хочу отправить захваченное изображение с клиента raspberry pie (python) на сервер (node.js).Мы закодировали изображение как base64 и отправили его обратно на сервер, используя декодирование base64 как изображения, но изображение было повреждено, поскольку файл был в другом формате.

Вот мой код:

client.py

import base64

from PIL import Image
import os, sys

ip = ''
port = 3008
s = socket.socket()
s.connect((ip, port))

image_path = '/home/pi/TCPproject/test.jpg'

if image_path != '':
    with open(image_path, "rb") as imageFile:
        image_data = base64.b64encode(imageFile.read())
else:
    image_data = 'cusdom_image'


s.send(image_data)

s.close()

server.js

var fs = require('fs');
var base64ToImage = require('base64-to-image');
var sockets = [];

var server = net_server.createServer(function(client) {
    console.log('Client connection: ');
    console.log('local = %s:%s', client.localAddress, client.localPort);
    console.log('remote = %s:%s', client.remoteAddress, client.remotePort);
    client.setTimeout(500);
    client.setEncoding('utf8');
    sockets.push(client);
    var imageData;

    client.on('data', function(data) {
        imageData+= data;
    });

    client.on('end', function() {
        console.log('end!')
        var decoded = Buffer.from(imageData, 'base64');
        fs.writeFile("test.jpg", decoded, function (err) {
            if (err) throw err;
            else  console.log('Saved!');
        });
    });

    client.on('error', function(err) {
        console.log('Socket Error: ', JSON.stringify(err));
    });

    client.on('timeout', function() {
        console.log('Socket Timed out');
    });
});

server.listen(3008, function() {
    console.log('Server listening: ' + JSON.stringify(server.address()));

    server.on('close', function(){
        console.log('Server Terminated');
    });

    server.on('error', function(err){
        console.log('Server Error: ', JSON.stringify(err));
    });
});

function writeData(socket, data){
    var success = socket.write(data);
    if (!success){
        console.log("Client Send Fail");
    }
}

Пожалуйста, дайте мне знать, если кодирование, декодирование неверно, или если процесс связи через сокет TCP неправильный,или если есть другая проблема.

1 Ответ

1 голос
/ 21 сентября 2019

Есть несколько проблем с кодом.На стороне клиента:

s.send(image_data)

Может отправлять image_data, но может отправлять только часть image_data, поскольку send не гарантирует отправку всего.Используйте sendall для отправки всего или проверьте возвращаемое значение send и убедитесь, что отправили остаток позже, если не все было отправлено сразу.

На стороне сервера:

var imageData;

client.on('data', function(data) {
    imageData+= data;
});

client.on('end', function() {
    console.log('end!')
    var decoded = Buffer.from(imageData, 'base64');

Если вы посмотрите на imageData до декодирования, вы увидите, что он начинается со строки undefined и только после этого следуют данные base64.Но все это рассматривается как ввод в декодер base64, что приводит к повреждению данных.Чтобы исправить это, инициализируйте imageData:

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