2016-04-21 5 views
1

Ich möchte 2 Bilder von Socket-Server (Java) zu Client-Socket (Python) senden.Senden Sie 2 Bilder von Socket-Server

-> Mein Problem Ich erhielt nur ein Bild (DataImage1) in Client.

Was habe ich falsch gemacht?

Ich sende (Java) die Bilder nacheinander:

... 
BufferedImage image = ImageIO.read (file); 
imgstr = encodeToString(image, "png"); 
outToClient.writeBytes(imgstr); 
... 
BufferedImage chart = ImageIO.read (fileChart); 
imgstrChart = encodeToString(chart, "png"); 
outToClient.writeBytes(imgstrChart); 
... 

I erhalten (Python) die Bilder nacheinander:

... 
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server_addr = (tcpclient.host , tcpclient.port) 
    client_socket.connect(server_addr) 
    dataImage1 = client_socket.recv(1024) 
    fp = open (pathImage1, "wb") 
    while dataImage1: 
     #{ 
     if not dataImage1: break 
     recvDataImage += dataImage1 
     dataImage1 = client_socket.recv(1024) 
     #} 
    fp.write(b64decode(recvDataImage1)) 
    fp.flush() 
    fp.close() 

    dataImage2 = client_socket.recv(1024) 
    fp = open (pathImage2, "wb") 
    while dataImage2: 
     #{ 
     if not dataImage2: break 
     recvDataImage2 += dataImage2 
     dataImage2 = client_socket.recv(1024) 
     #} 
    fp.write(b64decode(recvDataImage2)) 
    fp.flush() 
    fp.close() 
    .... 
+0

Haben Sie 'flow()' den OutputStream auf der Java-Seite? – Berger

+0

Sie meinen: outToClient.writeBytes (imgstrChart); \t outToClient.flush(); – Lolitta

+0

Ja genau das. – Berger

Antwort

3

Wie weiß der Empfänger, wo image1 Enden? In Ihrem Code ruft der Client fortlaufend auf, bis eine Nullzeichenfolge zurückgegeben wird. Dies geschieht erst, wenn der Socket geschlossen ist. Was passiert ist, dass Sie beide Bilder übertragen und der Client den Inhalt von beiden in die erste Datei schreibt.

Die zweite Schleife empfängt niemals Daten, da Sie nach dem Schließen nie mehr Daten vom Socket erhalten.

Sie müssen entweder (a) einen neuen Socket öffnen, um die zweite Datei zu übertragen, oder (b) die Länge jeder Datei als Teil Ihres Protokolls senden, damit der Client weiß, wie viel Sie in pathImage1 schreiben müssen, bevor Sie fortfahren zu pathImage2.

+0

Danke Gil, welche Lösung ist jetzt besser? Ich sage das 2. (b). Recht? wenn ich richtig verstehe, muss ich die Bilder zusammen mit der Länge jedes Bildes vorbinden, um es an den Kunden zu schicken ?. – Lolitta

+1

Sie haben beide ihre Vorteile. Am einfachsten zu implementieren IMO, ist (a): Lassen Sie den Client verbinden, senden Sie dem Server den Namen der Datei, die er als nächstes erhalten möchte, dann kann er das gesamte Ding auf einen Schlag empfangen und in eine Datei schreiben. Wenn nur der Server weiß, welche Dateien übertragen werden sollen, müssen Sie (b) verwenden: Fügen Sie den Dateinamen und die Größeninformationen inline ein, was bedeutet, dass ein Protokoll erstellt wird. Dies kann entweder ein "textbasiertes" Protokoll wie HTTP (geben Sie Name und Größe in Text gefolgt von Newline, dann der Dateiinhalt), oder ein Binärprotokoll (wo Sie binäre Felder kodieren/decodieren) sein. –