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



我想向我的Python服务器发送40x40px Blob,然后在那里处理它,并发回一个带有代表图像类的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,所以它对我来说很好

相关内容

  • 没有找到相关文章

最新更新