Java异步任务/套接字连接问题

Java异步任务/套接字连接问题,java,android,sockets,android-asynctask,Java,Android,Sockets,Android Asynctask,我对Java中的异步任务有一个问题: 我有一个移动应用程序,它向我的服务器发送一个映像,然后从该服务器接收另一个映像,然后通过套接字/端口接收0到100之间的7个int值。所以我有一个AsnycTask,我用DoInBackground方法完成所有的连接/发送/接收工作。图像工作正常,但问题是int[]:我有一个长度为7的probabilities[]int数组,我将接收到的值放在其中(在DoInBackground中)。然后,在onPostExecute中,我调用我自己的函数,我需要这些值 现

我对Java中的异步任务有一个问题:

我有一个移动应用程序,它向我的服务器发送一个映像,然后从该服务器接收另一个映像,然后通过套接字/端口接收0到100之间的7个int值。所以我有一个AsnycTask,我用DoInBackground方法完成所有的连接/发送/接收工作。图像工作正常,但问题是int[]:我有一个长度为7的probabilities[]int数组,我将接收到的值放在其中(在DoInBackground中)。然后,在onPostExecute中,我调用我自己的函数,我需要这些值

现在的问题是:有时这些值存在,有时数组仍然只有0(我确信数据不仅仅是零)

这是我的AsnyTask代码

    class ConnectTask extends AsyncTask<Void, Void, Void> {
                @Override
                protected Void doInBackground(Void... voids) {
                    try {
                        //Connect to my PC and send my image from my phone
                        Socket photoSocket = new Socket(IP_ADDRESS, PORT_NO);
                        DataOutputStream dos = new DataOutputStream(photoSocket.getOutputStream());
                        FileInputStream fis = new FileInputStream(pathname);
                        int size = fis.available();
                        byte[] data = new byte[size];
                        fis.read(data);
                        dos.write(data);
                        dos.flush();
                        fis.close();
                        dos.close();
                        photoSocket.close();
    
                        //now receive the other image from server
                        ServerSocket serverSocket = new ServerSocket(1235);
                        Socket incomingSocket = serverSocket.accept();
                        InputStream is = incomingSocket.getInputStream();
                        FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory() + "/image_from_server.jpg");
                        BufferedOutputStream bos = new BufferedOutputStream(fos);
                        byte[] aByte = new byte[40000];
                        int bytesRead;
    
                        while ((bytesRead = is.read(aByte)) != -1) {
                            bos.write(aByte, 0, bytesRead);
                        }
    
                        is.close();
                        fos.close();
                        bos.close();
                        serverSocket.close();
                        incomingSocket.close();
    
    
                        //now Receive Values (ints)
                        ServerSocket serverSocket2 = new ServerSocket(1236);
                        Socket incomingSocket2 = serverSocket2.accept();
                        InputStream inputstream = incomingSocket2.getInputStream();
                        byte[] data2 = new byte[7];
                        inputstream.read(data2);
                        //Fill array with received ints THIS IS SOMETIMES WORKING, SOMETIMES probabilities[] STAYS FILLED WITH 0s
                        for (int i = 0; i < data2.length; i++){
                            probabilities[i] = data2[i];
                        }
    
                        serverSocket2.close();
                        incomingSocket2.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return null;
                }
    
                @Override
                protected void onPreExecute() {
                //irrelevant
                }
    
                @Override
                protected void onPostExecute(Void aVoid) {
                    File xaifile = new File(Environment.getExternalStorageDirectory() + "/image_from_server.jpg");
//...doing some UI stuff
//..................
//..................
                    //now call function where i replace picture. Since this is in the "postExecute" method, my probabilities[] should have been filled with data since its in the doInBackground method.
                    replacePicture(xaifile);
                }
            }
    
            ConnectTask connect =  new ConnectTask();
            Void[] param = null;
            //execute Async task
            connect.execute(param);
class ConnectTask扩展了AsyncTask{
@凌驾
受保护的空位背景(空位…空位){
试一试{
//连接到我的电脑并从手机发送我的图像
Socket photoSocket=新套接字(IP地址、端口号);
DataOutputStream dos=新的DataOutputStream(photoSocket.getOutputStream());
FileInputStream fis=新的FileInputStream(路径名);
int size=fis.available();
字节[]数据=新字节[大小];
fis.读取(数据);
写(数据);
dos.flush();
fis.close();
dos.close();
photoSocket.close();
//现在从服务器接收另一个映像
ServerSocket ServerSocket=新的ServerSocket(1235);
Socket incomingSocket=serverSocket.accept();
InputStream=incomingSocket.getInputStream();
FileOutputStream fos=新的FileOutputStream(Environment.getExternalStorageDirectory()+“/image\u from_server.jpg”);
BufferedOutputStream bos=新的BufferedOutputStream(fos);
字节[]aByte=新字节[40000];
int字节读取;
而((bytesRead=is.read(aByte))!=-1){
bos.write(aByte,0,bytesRead);
}
is.close();
fos.close();
bos.close();
serverSocket.close();
incomingSocket.close();
//现在接收值(整数)
ServerSocket serverSocket2=新的ServerSocket(1236);
Socket incomingSocket2=serverSocket2.accept();
InputStream InputStream=incomingSocket2.getInputStream();
字节[]数据2=新字节[7];
inputstream.read(数据2);
//用接收到的整数填充数组这有时有效,有时概率[]保持用0填充
对于(int i=0;i
inputstream.read(data2)可能返回-1,这意味着没有读取字节,data2保留为零,因此如果read返回-1,请处理并重试。

inputstream.read(data2)可能返回-1,这意味着没有读取字节,data2保留为零,因此如果read返回-1,请处理并重试。

然后从该服务器接收另一个映像,
此时,您的服务器不再是服务器,而是运行在Android设备上的服务器套接字的客户端。你做了一个非常奇怪的构造,让你的Android应用程序先是客户端,然后是服务器,最后又是客户端检查实际读取的字节数并进行相应处理。
int nread=fis.read(数据)
然后从该服务器接收另一个映像,
此时,您的服务器不再是服务器,而是运行在Android设备上的服务器套接字的客户端。你做了一个非常奇怪的构造,让你的Android应用程序先是客户端,然后是服务器,最后又是客户端检查实际读取的字节数并进行相应处理。
int nread=fis.read(数据)