gpt4 book ai didi

java - 使用单个 AsyncTask 向 Python 服务器发送数据,然后从 Python 服务器接收数据

转载 作者:太空宇宙 更新时间:2023-11-04 09:03:49 24 4
gpt4 key购买 nike

我想将 40x40px blob 发送到我的 Python 服务器,然后在那里处理它并发回一个带有代表图像类的 id 的回复(它是一个图像分类任务)。我使用 AsyncTask,这里出现了一个问题 - blob 被发送到服务器,但我的 Android 代码中没有到达负责接收回复的部分。

我想知道在单个 AsyncTask 中发送和接收数据是否正确。我读到,对于这个解决方案来说,花费大约 <10 秒的任务就可以了,所以理论上我的情况应该没有问题。

这里我附上我的代码,供客户使用:

public class ServerConnectAsyncTask extends AsyncTask<Void, Void, Integer> {

private AsyncTaskResultListener asyncTaskResultListener;
private Socket socket;
private Mat img;

ServerConnectAsyncTask(Mat blob, Context c) throws IOException {
img = blob;
asyncTaskResultListener = (AsyncTaskResultListener) c;
}

@Override
protected Integer doInBackground(Void... voids) {
MatOfByte buf = new MatOfByte();
Imgcodecs.imencode(".jpg", img, buf);
byte[] imgBytes = buf.toArray();

try {
socket = new Socket("192.168.0.109",8888);
DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
DataInputStream din = new DataInputStream(socket.getInputStream());

dout.write(imgBytes);
dout.flush();

String str = din.readUTF(); // it seems that it doesn't reach this line

dout.close();
din.close();
socket.close();

return Integer.valueOf(str);
} catch (IOException e) {
e.printStackTrace();
return 99;
}
}

@Override
protected void onPostExecute(Integer imgClass) {
asyncTaskResultListener.giveImgClass(imgClass);
}
}

对于 python 服务器:

HOST = "192.168.0.109"
PORT = 8888

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))

s.listen(10)

while True:
conn, addr = s.accept()
print("Got connection from", addr)

msg = conn.recv(4096)

buf = np.frombuffer(msg, dtype=np.uint8).reshape(-1, 1)
img = cv2.imdecode(buf, 0)
cv2.imwrite("output.jpg", img) # here I save my blob correctly

if msg:
message_to_send = "0".encode("UTF-8") # then I send my "predicted" image class
conn.send(message_to_send)
else:
print("no message")

同样重要的是,我在 onCameraFrame() 方法中调用 AsyncTask.execute() - 每隔一段时间(不是在每一帧中,只有当我的 blob 足够“稳定”时,这种情况很少发生)。

最佳答案

显然它卡在了 readUTF() 部分。现在它可以工作了:

DataInputStream din = new DataInputStream(socket.getInputStream());
int str = din.read();
char sign = (char) str;

dout.close();
din.close();
socket.close();
return Character.getNumericValue(sign);

现在,当我从 python 服务器发送“0”时,它返回 0,所以它对我来说工作得很好。

关于java - 使用单个 AsyncTask 向 Python 服务器发送数据,然后从 Python 服务器接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60466887/

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