gpt4 book ai didi

java - 使用套接字通过 Python 将图像文件从 Android 手机发送到 PC

转载 作者:行者123 更新时间:2023-12-01 17:35:53 26 4
gpt4 key购买 nike

我想通过套接字将图像从我的 Android 设备发送到 python,我已经成功从 Android-Python 发送文本。当我发送图像时,我得到了正在发送的图像的 toast,但在接收端图像已损坏,大小为 0 KB我感谢任何帮助,因为我目前被困在这里。

这是我的代码

图像.py

from socket import *

port = 8888
s = socket(AF_INET, SOCK_STREAM)
s.bind(('', port))
s.listen(1) #listens to 1 connection
conn, addr = s.accept()
print("Connected by the ",addr)

while True:
data = conn.recv(1024)
with open('image.jpg', 'wb') as file:
file.write(data)


conn.close()

Android端代码是,

public void send(View v) {
Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
startActivityForResult(i, 1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == 1 && resultCode == RESULT_OK) {

try {
final Uri imageUri = data.getData();
final InputStream imageStream = getContentResolver().openInputStream(imageUri);
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
imageView.setImageBitmap(selectedImage);

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
selectedImage.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
byte[] array = byteArrayOutputStream.toByteArray();

SendImageClient sendImageClient = new SendImageClient();
sendImageClient.execute(array);

} catch (FileNotFoundException e) {
e.printStackTrace();
}

} else {
Toast.makeText(this, "no image selected", Toast.LENGTH_SHORT).show();
}

}


public class SendImageClient extends AsyncTask<byte[], Void, Void> {


@Override
protected Void doInBackground(byte[]... voids) {

try {
Socket socket= new Socket("192.168.0.106",8888);

OutputStream out=socket.getOutputStream();
DataOutputStream dataOutputStream=new DataOutputStream(out);
dataOutputStream.writeInt(voids[0].length);
dataOutputStream.write(voids[0],0,voids[0].length);
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Image sent", Toast.LENGTH_SHORT).show();
}
});

dataOutputStream.close();
out.close();
socket.close();

} catch (IOException e) {
e.printStackTrace();
}


return null;
}
}

最佳答案

您的 python 代码在每次循环运行时都会截断输出文件。在最后一次运行时,当连接关闭时,文件被截断,conn.recv 将返回一个空字符串,并且不会向文件写入任何其他内容。

with open(..) 移到从套接字读取数据的循环之外,并处理连接关闭,这样就不会出现无限循环:

with open('image.jpg', 'wb') as file:
while True:
data = conn.recv(1024)
if not data: break
file.write(data)

您的 java 代码在发送数据之前先发送它发送的数据的大小 - 您应该删除它或调整 python 代码以考虑到这一点。

            dataOutputStream.writeInt(voids[0].length);
dataOutputStream.write(voids[0],0,voids[0].length);

关于java - 使用套接字通过 Python 将图像文件从 Android 手机发送到 PC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61042985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com