Socket Programming Python Server and C client

Issue

This Content is from Stack Overflow. Question asked by Zodiac

Guys
this is what i make in python server code (receiving data length from C client and then receiving image file(.jpg))
but problem is when i receiving data length error occurs “invaild base64-encoded string”

here is my servercode (Removed unnecessary functions) and when trying to run the stringData part the error occurs

import os
import socket
import cv2
import numpy
import base64
import glob
import sys
import time
import threading
from datetime import datetime

class ServerSocket:

    def receiveImages(self):
        cnt_str = ''
        cnt = 0

        try:
            while True:
                if (cnt < 10):
                    cnt_str = '000' + str(cnt)
                elif (cnt < 100):
                    cnt_str = '00' + str(cnt)
                elif (cnt < 1000):
                    cnt_str = '0' + str(cnt)
                else:
                    cnt_str = str(cnt)
                if cnt == 0: startTime = time.localtime()
                cnt += 1

                length = self.conn.recv(64)
                print(length)
                length1 = length.decode('utf-8')
                print(length1)
        
                stringData = self.recvall(self.conn, int(length1))
               ## stringData = self.conn.recv(100000)
               ##print(stringData)

               msg = "ready"
                self.conn.sendall(msg.encode())

               stime = self.recvall(self.conn, 64)
               print('send time: ' + stime.decode('utf-8'))
                now = time.localtime()
               print('receive time: ' + datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f'))

                data = numpy.frombuffer(base64.b64decode(stringData), numpy.uint8)
                decimg = cv2.imdecode(data, 1)
                cv2.imshow("image", decimg)
                cv2.imwrite('./' + str(self.TCP_PORT) + '_images' + str(self.folder_num) + '/img' + cnt_str + '.jpg', decimg)
                cv2.waitKey(1)

                if (cnt == 60 * 10):
                    cnt = 0
                    convertThread = threading.Thread(target=self.convertImage(str(self.folder_num), 600, startTime))
                    convertThread.start()
                    self.folder_num = (self.folder_num + 1) % 2


        except Exception as e:
            print(e)
            #self.convertImage(str(self.folder_num), cnt, startTime)
            self.socketClose()
            cv2.destroyAllWindows()
            self.socketOpen()
            self.receiveThread = threading.Thread(target=self.receiveImages)
            self.receiveThread.start()
        
    def recvall(self, sock, count):
        buf = b''
        while count:
            newbuf = sock.recv(count)
            if not newbuf: return None
            buf += newbuf
            count -= len(newbuf)
        return buf    

    def convertImage(self, fnum, count, now):
        img_array = []
        cnt = 0
        for filename in glob.glob('./' + str(self.TCP_PORT) + '_images' + fnum + '/*.jpg'):
            if (cnt == count):
                break
            cnt = cnt + 1
            img = cv2.imread(filename)
            height, width, layers = img.shape
            size = (width, height)
            img_array.append(img)
        
        file_date = self.getDate(now)
        file_time = self.getTime(now)
        name = 'video(' + file_date + ' ' + file_time + ').mp4'
        file_path = './videos/' + name
        out = cv2.VideoWriter(file_path, cv2.VideqqoWriter_fourcc(*'.mp4'), 20, size)

        for i in range(len(img_array)):
            out.write(img_array[i])
        out.release()
        print(u'complete')


def main():
    server = ServerSocket('ServerIP', PORT)

if __name__ == "__main__":
    main()

what could it be the problems? in my expectation when decode the string data it can be the problem that C client encode causes problem



Solution

This question is not yet answered, be the first one who answer using the comment. Later the confirmed answer will be published as the solution.

This Question and Answer are collected from stackoverflow and tested by JTuto community, is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.

people found this article helpful. What about you?