2016-04-21 41 views
1

我想從套接字服務器(Java)發送2個圖像到客戶端套接字(python)。發送2圖像來自套接字服務器

- >我的問題我在客戶端只收到一個Image(dataImage1)。

我做了什麼錯誤?

我送(JAVA)的圖像依次爲:

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

我收到(Python)的圖像依次爲:

... 
    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

你'沖洗()'在java端OutputStream? – Berger

+0

您的意思是: outToClient.writeBytes(imgstrChart); \t outToClient.flush(); – Lolitta

+0

是的。 – Berger

回答

3

如何接收器知道在哪裏結束此搜索?在您的代碼中,客戶端一直呼叫client_socket.recv,直到返回空字符串。直到套接字關閉纔會發生這種情況。因此,發生的情況是,您正在傳輸這兩個圖像,並且客戶端將這兩個內容寫入第一個文件。

第二個循環永遠不會收到任何數據,因爲一旦關閉,您永遠不會從套接字接收更多數據。

您需要(a)打開一個新的套接字來傳輸第二個文件,或者(b)將每個文件的長度作爲您的協議的一部分發送,以便客戶端知道在繼續之前要寫入多少內容到pathImage1pathImage2

+0

謝謝Gil,現在哪種解決方案更好?我說第二(二)。對? 當我正確理解時,我必須將圖像連同每個圖像的長度一起發送給客戶端? – Lolitta

+1

他們都有自己的優勢。最簡單的實現IMO是(a):讓客戶端連接,然後向服務器發送下一個想要接收的文件的名稱,然後它可以一舉接收整個事件並將其寫入文件。如果只有服務器知道要傳輸哪些文件,則需要使用(b):在內部包含文件名和大小信息,這意味着建立協議。這可以是一個「基於文本的」協議,如HTTP(在文本中提供名稱和大小,然後是換行符,然後是文件內容)或二進制協議(用於編碼/解碼二進制字段)。 –

相關問題