2017-05-22 4 views
0

Ich habe versucht, Code zu schreiben, um ein Bild an den Server zu senden, der es modifiziert und sendet es zurück an den Client. Ich sende das Bild in Teilen der Länge 1024. Die Idee war, einige Bildbearbeitung mit Opencv auf der Serverseite zu tun und dann das Bild zurück zum Client zu senden. Allerdings hält mein Client-Code jedes Mal die Ausführung an, bevor das Bild empfangen wird. Ich habe das Gefühl, dass dies ein Synchronisierungsproblem ist. Der Client ruft recv auf, bevor der Server die Image-Datei (Client.py) erstellt. My Server-Side-Code:Senden und Abrufen eines Bildes durch Socket-Programmierung in Python

from socket import * 

serverPort = 12000 
serverSocket = socket(AF_INET, SOCK_STREAM) 
serverSocket.bind(('', serverPort)) 
serverSocket.listen(1) 
print("Server is ready to service...") 

while 1: 
    connectionSocket, addr = serverSocket.accept() 
    res = '' 
    while 1: 
     t = connectionSocket.recv(1024) 
     if not t: 
      break 
     res += t 
    g = open("Client.jpg", "wb") 
    g.write(res) 
    g.close() 
    print("Image received and recreated") 


    f = open("Client.jpg", "rb") 
    #print(len(f)) 
    print("Sending image data...") 
    while 1: 
     print("In while") 
     #data = f.read(1024) 
     if not data: 
      break 
     connectionSocket.send(data) 
     print("Data sent:"+str(len(data))) 

    connectionSocket.close() 

Der Client-Seite Code:

from socket import * 
import time 

serverName = 'localhost' 
serverPort = 12000 

clientSocket = socket(AF_INET, SOCK_STREAM) 
clientSocket.connect((serverName, serverPort)) 

Image = open("BG.jpg", "rb") 

print("Sending image data...") 
while 1: 
    data = Image.read(1024) 
    if not data: 
     break 
    clientSocket.send(data) 
    #print(len(data)) 

print("Data has been sent!") 
print("-------------------") 
time.sleep(3) 
print("Receving data") 

res = '' 
while 1: 
    print("in while") 
    t = clientSocket.recv(1024) 
    print(len(t)) 
    if not t: 
     break 
    res += t 

g = open("Response.jpg", "wb") 
g.write(res) 
g.close() 

clientSocket.close() 

Bitte lassen Sie mich wissen, wenn ich mehr Informationen zur Verfügung stellen soll.

Die Ausgabe von beiden Seiten ist nicht viel. Ausgabe auf Client-Seite:

Sending image data... 
Data has been sent! 
------------------- 
Receving data 
in while 

Ausgabe auf Server-Seite:

Server is ready to service... 
Image received and recreated 
Sending image data... 
In while 

Dies ist die Ausgabe, nachdem ich den Code laufen für etwa zwei Minuten laufen lassen, bevor er unterbrochen wird.

+0

könnten Sie bitte die Ausgabe des Programms auch posten? –

+0

Ich habe es getan. –

Antwort

0

Es ist seltsam, dass der Server Image received and recreated schreiben konnte, bevor der Client beendet wurde, weil der Code eine Schleife Lesen enthält, bis die Buchse oder geschlossen geschlossen ist:

In dieser Art von Austausch
while 1: 
    t = connectionSocket.recv(1024) 
    if not t: # t should be empty only when the socket is shut down or closed... 
     break 
    res += t 

Der Server kann nicht wissen, wann der Client mit dem Senden von Daten fertig ist. Sie sollten ein Protokoll verwenden, um das zu sagen. Zum Beispiel könnten Sie zuerst die Länge der Datei und dann die Daten senden, und der Server würde wissen, dass er, wenn er die korrekte Anzahl von Bytes erhalten hat, seine eigene Verarbeitung durchführen kann.

Alternativ, da Sie nur eine Übertragung auf jeder Seite haben, können Sie den Socket zum Senden zuerst vom Client, dann vom Server herunterfahren, aber es ist nicht die korrekte Verwendung von shut, die normalerweise zu einem niedrigeren verwendet wird Level, um ein ordnungsgemäßes Herunterfahren einzurichten.

Verwandte Themen