2016-04-21 40 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(在文本中提供名称和大小,然后是换行符,然后是文件内容)或二进制协议(用于编码/解码二进制字段)。 –

相关问题