首页 > 解决方案 > 在 Python 中通过 Socket 读取图像文件

问题描述

我正在尝试通过 Python 套接字读取图像文件。我目前的尝试如下:

while True:
    data = clientsocket.recv(1024)
    receivedMessage = (data.decode(encoding='UTF-8')).strip()
    if ("getFile" in receivedMessage):
        f = open("test2.jpg","wb")
        file_size = int(receivedMessage.replace('getFile',''))
        # Message: e.g. getFile28049994
        read_bytes = 0
        print("READING FILE")
        while file_size > read_bytes:
            print("RECEIVING FILE")
            bytes_read = clientsocket.recv(1024)
            if not bytes_read:
                print("END OF FILE")
            print("CHECKPOINT") # this is never printed out
            read_bytes = len(bytes_read)
            #writing to file 

该文件通过 Android 作为字节数组发送: 客户端类:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ConnectException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client extends AsyncTask<String, Void, Void> {
    private MainActivity activity;
    private Exception exception;
    private byte[] data;
    private String dataString;
    public Client(MainActivity activity,byte[] data){
        this.activity = activity;
        this.data = data;
    }
    public Client(MainActivity activity,String dataString){
        this.activity = activity;
        this.dataString = dataString;
    }

    protected Void doInBackground(String... command) {
        try{
            Socket client = new Socket(".....", 50000);
            PrintWriter out = new PrintWriter(client.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            if (data != null){
                out.print(data);
            }
            if (dataString != null){
                out.println(dataString);
            }
            String receivedMessage;
            if ((receivedMessage = in.readLine()) != null){
                if (receivedMessage.equals("connectionSuccessful")){
                    Intent intent = new Intent();
                    intent.setAction("sendServerMessage");
                    intent.putExtra("msg",receivedMessage);
                    activity.sendBroadcast(intent);

                }
                Log.e("Debug",receivedMessage);
            }

            client.close();
        } catch(UnknownHostException e) {
            Log.e("Exception","Unknown host");

        }
        catch(ConnectException e) {
            Intent intent = new Intent();
            intent.setAction("sendServerMessage");
            intent.putExtra("msg","connectionFailed");
            activity.sendBroadcast(intent);
            Log.e("Exception","No I/O"+e);
        }
        catch (Exception e){
            Log.e("Exception",""+e);

        }
        return null;
     }

}

以及客户端的执行:

new Client(activity, bytes).execute(); // bytes is a byte array (checked it)

知道为什么没有收到吗?是因为我调用了两次clientsocket.recv吗?我该如何解决?提前致谢。

标签: pythonsocketsserverclientfile-transfer

解决方案


推荐阅读