0

イメージをバイト配列として送信するJavaクライアントと、イメージを受信するPythonサーバーをプログラミングしています。受け取った画像の高さ、幅、チャンネルは正しく、

sock = socket.socket()
sock.bind(('localhost', 8080))
sock.listen(1)
print ("Listen")
conn, addr = sock.accept()

print('Start server')
while True:
    data = conn.recv(1024)
    if not data:
        break
    img = cv2.imdecode(np.fromstring(io.BytesIO(data).getvalue(), dtype=np.uint8), 1)
    np.save('snapshot.npy',img)
    exit()

を使用して画像を表示するcv2.imshow('img', img)と、正しくない結果が得られます:出力例

Java 側:

public class Client implements Runnable {

private Socket socket;
private DataOutputStream out;
private String server;
private int port;

private ArrayList<ResponseListener> listeners = new ArrayList<>();

public void addListener(ResponseListener responseListener){
    listeners.add(responseListener);
}

public void removeListeners(ResponseListener responseListener){
    listeners.remove(responseListener);
}

Client(String server, int port) {
    this.server = server;
    this.port = port;
}

public void start(){
    while(socket==null){
        try {
            socket = new Socket(server, port);
            socket.setTcpNoDelay(true);
            System.out.println("Ready");
            listeners.forEach((listener)->listener.serverIsReady());
        } catch (Exception ex) {
            System.out.println("In thread " + ex.toString());
        }
    }
}

public void send(byte[] img) throws IOException {
    out.write(img);
}

@Override
public void run() {

    InputStreamReader in = null;
    try {
        in = new InputStreamReader(socket.getInputStream());
        System.out.println(in);
        out = new DataOutputStream(socket.getOutputStream());
    } catch (IOException e) {
        System.out.println("in or out failed");
        System.exit(-1);
    }
    int count = 0;
    while (true) {
        try {
            int line = in.read();
            count++;
            if(count==4) {
                listeners.forEach((listener)->listener.onSignDefined(String.valueOf(line)));
                count=0;
            }
        } catch (Exception e) {
            System.out.println("In loop " + e.toString());
            System.exit(-1);
        }
    }
}

}

4

1 に答える 1

0

問題を解決しました。ソリューションは非常に簡単です: data = conn.recv(640*480*3)

640*480*3 - 画像のサイズ

于 2017-06-10T20:22:28.870 に答える