Python Socket can't send after adding conditions

Viewed 79

I use this code to test socket.

server.py

import socket
import cv2
import pickle
import struct

HOST='127.0.0.1'
PORT=8485
socketserver=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('Socket created')

socketserver.bind((HOST,PORT))
print('Socket bind complete')
socketserver.listen(10)
print('Socket now listening')
counter = 1
clientsocket,addr=socketserver.accept()

data = b""
payload_size = struct.calcsize(">L")
print("payload_size: {}".format(payload_size))
while True:
    counter += 1
    while len(data) < payload_size:
        data += clientsocket.recv(4096)
    packed_msg_size = data[:payload_size]
    data = data[payload_size:]
    msg_size = struct.unpack(">L", packed_msg_size)[0]
    print("msg_size: {}".format(msg_size))
    while len(data) < msg_size:
        data += clientsocket.recv(4096)
    frame_data = data[:msg_size]
    data = data[msg_size:]
    frame=pickle.loads(frame_data, fix_imports=True, encoding="bytes")
    frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
    cv2.imshow('ImageWindow',frame)
    cv2.waitKey(1)
    msg = "message" + str(counter)
    clientsocket.send(msg.encode("utf-8"))
cv2.destroyAllWindows()

client.py

# -*- coding: UTF-8 -*-

import cv2
import socket
import struct
import pickle
import time

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8485))
connection = client_socket.makefile('wb')
cam = cv2.VideoCapture(0)
img_counter = 0
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]
while True:
    ret, frame = cam.read()
    result, frame = cv2.imencode('.jpg', frame, encode_param)
    data = pickle.dumps(frame, 0)
    size = len(data)
    client_socket.sendall(struct.pack(">L", size) + data)
    img_counter += 1
    msg = client_socket.recv(1024)
    if msg:
        print(msg.decode("utf-8"))
cam.release()

When I use these code, there is no error and the output is like this:
server.py output:

Socket created
Socket bind complete
Socket now listening
payload_size: 4
msg_size: 79514
msg_size: 79873
msg_size: 79128
msg_size: 79518
msg_size: 79566
msg_size: 79818
msg_size: 79974
msg_size: 79273
msg_size: 79510
msg_size: 79332
msg_size: 79571
msg_size: 79759
msg_size: 79323
msg_size: 79727
msg_size: 79558
msg_size: 79617
msg_size: 79582
msg_size: 79794
msg_size: 79423
msg_size: 80192
msg_size: 80049
msg_size: 79229
msg_size: 79196

client.py output:

message2
message3
message4
message5
message6
message7
message8
message9
message10
message11
message12
message13
message14
message15
message16
message17
message18
message19
message20
message21
message22
message23
message24

But when I add a condition to the socket server, the client and the server can't send anymore.

server.py

import socket
import cv2
import pickle
import struct

HOST='127.0.0.1'
PORT=8485
socketserver=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('Socket created')

socketserver.bind((HOST,PORT))
print('Socket bind complete')
socketserver.listen(10)
print('Socket now listening')
counter = 1
clientsocket,addr=socketserver.accept()

data = b""
payload_size = struct.calcsize(">L")
print("payload_size: {}".format(payload_size))
while True:
    counter += 1
    while len(data) < payload_size:
        data += clientsocket.recv(4096)
    packed_msg_size = data[:payload_size]
    data = data[payload_size:]
    msg_size = struct.unpack(">L", packed_msg_size)[0]
    print("msg_size: {}".format(msg_size))
    while len(data) < msg_size:
        data += clientsocket.recv(4096)
    frame_data = data[:msg_size]
    data = data[msg_size:]
    frame=pickle.loads(frame_data, fix_imports=True, encoding="bytes")
    frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
    cv2.imshow('ImageWindow',frame)
    cv2.waitKey(1)
    if counter % 10==0: #add condition
        msg = "message"+str(counter)
        clientsocket.send(msg.encode("utf-8"))
cv2.destroyAllWindows()

server.py output:

Socket created
Socket bind complete
Socket now listening
payload_size: 4
msg_size: 76263

Where is wrong?

1 Answers

As Mr jasonharper said. I modify my code like this:

server.py

import socket
import cv2
import pickle
import struct

HOST='127.0.0.1'
PORT=8485
socketserver=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('Socket created')

socketserver.bind((HOST,PORT))
print('Socket bind complete')
socketserver.listen(10)
print('Socket now listening')
counter = 1
clientsocket,addr=socketserver.accept()

data = b""
payload_size = struct.calcsize(">L")
print("payload_size: {}".format(payload_size))
while True:
    counter += 1
    while len(data) < payload_size:
        data += clientsocket.recv(4096)
    packed_msg_size = data[:payload_size]
    data = data[payload_size:]
    msg_size = struct.unpack(">L", packed_msg_size)[0]
    print("msg_size: {}".format(msg_size))
    while len(data) < msg_size:
        data += clientsocket.recv(4096)
    frame_data = data[:msg_size]
    data = data[msg_size:]
    frame=pickle.loads(frame_data, fix_imports=True, encoding="bytes")
    frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
    cv2.imshow('ImageWindow',frame)
    cv2.waitKey(1)
    if counter % 10==0: #add condition
        msg = "message"+str(counter)
        clientsocket.send(msg.encode("utf-8"))
cv2.destroyAllWindows()

client.py

# -*- coding: UTF-8 -*-

import cv2
import socket
import struct
import pickle
import time

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8485))
connection = client_socket.makefile('wb')
cam = cv2.VideoCapture(0)
img_counter = 0
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]
while True:
    ret, frame = cam.read()
    result, frame = cv2.imencode('.jpg', frame, encode_param)
    data = pickle.dumps(frame, 0)
    size = len(data)
    client_socket.sendall(struct.pack(">L", size) + data)
    img_counter += 1
    if img_counter % 30 == 0:
        msg = client_socket.recv(1024)
        if msg:
            print(msg.decode("utf-8"))
cam.release()

Then everything is OK!

output:

message10message20message30
message40message50message60
message70message80message90
Related