2015-11-03 74 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