2015-11-03 75 views
0

我试图从Python 3.4使用套接字接收从Android到PC的图像。我的服务器代码如下:python3.4套接字服务器接收图像

import socket 
import struct 
import sys 
address = ("10.0.0.22", 5000) 
try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
except (socket.error, msg): 
    print ('Failed to create socket.Error code:' + str(msg[0]) + ', Error message: ' + msg[1]) 
sys.exit() 
print ('Socket Created') 
s.bind(address) 
s.listen(5) 

while True: 
    (client, addr) = s.accept() 
    print ('got connected from', client,addr) 
    buf = b'' 
    while len(buf)<4: 
     buf += client.recv(4-len(buf)) 
    size = struct.unpack('!i', buf) 
    print ("receiving %s bytes" % size) 

    with open('tst.jpg', 'wb') as img: 
     while True: 
      data = client.recv(1024) 
      print (data) 
      if not data: 
       break 
      img.write(data) 
    img.close() 
print ('received, yay!') 
client.close() 

但它返回我一个tst.jpg比我的Android image.And小4个字节,我无法打开图像。

这是我的Android代码:

FileOutputStream fop; 
Socket socket; 
try { 
    fop=new FileOutputStream("/sdcard/dd.jpg"); 
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, fop); 
    fop.close(); 
    Toast.makeText(MainActivity.this, "saved",Toast.LENGTH_LONG).show(); 

    InetAddress serverAdd = InetAddress.getByName("10.0.0.22"); 
    SocketAddress sc_add = new InetSocketAddress(serverAdd,5000); 
    socket = new Socket(); 
    socket.connect(sc_add,2000); 

    DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
    byte[] bytes = baos.toByteArray(); 
    out.write(bytes); 
    out.close(); 
    socket.close(); 
} 

回答

0

蛇皮服务器期望前四个字节表示后面的文件的长度。

您的android代码不会发送包含字节数组长度的整数的四个字节。

因此先发送这样一个整数的四个字节。

int size = bytes.length; 
+0

您还可以先发送值为0的四个字节,因为python代码除了只记录它之外不会使用它。 – greenapps

+0

我还有一个问题。为什么服务器写图像这么慢。我该如何修改它?谢谢。 – jay

+0

我看不出有多快。如果你不告诉我,我们永远不会知道。 – greenapps