1

私は現在、文字列とファイルをリモートコンピューターで実行されているJavaサーバーアプリに送信するAndroidアプリに取り組んでいます。この Java サーバー アプリは、ファイルのインデックスを見つけて、このインデックスの値を送り返す必要があります (ファイル構造は次のとおりです: インデックス値。例: 1 青) ファイルはリモート マシンで適切に送受信され、メソッドがあります。ファイルで受け取ったインデックスの値を見つけます。しかし、見つかった値を電話に送り返そうとすると、例外 (閉じたソケット) が発生しますが、ソケットやバッファーを閉じていません。閉じているソケットがモバイル アプリ ソケットなのか Java サーバー アプリ ソケットなのかわかりません。送信して受信するために使用するのと同じソケットを使用しています (これが Android での作業方法です)。回答を電話に送り返すことは、私のプロジェクトに欠けているものであり、私が助けを必要としているものです.

クライアント アプリ (Android アプリ):

 private class HeavyRemProcessing extends AsyncTask<String, Void, String>
        {

            protected String doInBackground(String... urls) 
             {
                    begins = System.currentTimeMillis();

                            remoteExecution();

                ends= System.currentTimeMillis();
                procTime=ends-begins;
                aux= Long.toString(procTime);

               return aux;
             } //doInBackground() ends

            protected void onPostExecute(String time)
              {
                textView1.setText("Result: "+result+". Processing Time: "+time+" milisecs"); 
              }// onPostExecute ends

        } //HeavyRemProcessing ends


     public void executor(View view)
      {     
         key="74FWEJ48DX4ZX8LQ";

         HeavyRemProcessing task = new HeavyRemProcessing();
         task.execute(new String[] { "????" });     
      } //executor() ends


     public void remoteExecution()
        {
               // I have fixed IP and port I just deleted 
           String ip;  //SERVER IP
           int port;   // SERVER PORT 

             try
               {
                 cliSock = new Socket(ip, port);

                 file= new File("/mnt/sdcard/download/Test.txt"); 

                 long length = file.length();
                 byte[] bytes = new byte[(int) length];

                 FileInputStream fis = new FileInputStream(file);
                 BufferedInputStream bis = new BufferedInputStream(fis);
                 BufferedOutputStream out = new BufferedOutputStream(cliSock.getOutputStream());
                 BufferedReader in = new BufferedReader(new InputStreamReader(cliSock.getInputStream()));


                 int count;
                 key=key+"\r\n";
                 out.write(key.getBytes());
                 while ((count = bis.read(bytes)) > 0) 
                  {
                     out.write(bytes, 0, count);
                  }  //It works perfectly until here


                   //// PROBABLY HERE IS THE PROBLEM:               
                out.flush();
                out.close();
                fis.close();
                bis.close();                    

                result= in.readLine();  //RECEIVE A STRING FROM THE REMOTE PC


              }catch(IOException ioe)
                {
                 // Toast.makeText(getApplicationContext(),ioe.toString() +   ioe.getMessage(),Toast.LENGTH_SHORT).show();  
                } 

            }catch(Exception exp)
              {
                 //Toast.makeText(getApplicationContext(),exp.toString() +   exp.getMessage(),Toast.LENGTH_SHORT).show();               
              }   

        } //remoteExecution ends

Java サーバーアプリ (リモート PC)

 public void receivingFile()
      {
         System.out.println("Executing Heavy Processing Thread (Port 8888).");

         try 
            {
                serverSocket = new ServerSocket(8888);
                InputStream is = null;
                OutputStream os= null;
                FileOutputStream fos = null;
                BufferedOutputStream bos = null;
                BufferedOutputStream boSock =null;
                DataOutputStream dataOutputStream=null;
                int bufferSize = 0;


                try 
                   {
                     socket = serverSocket.accept();  
                     System.out.println("Heavy Processing Task Connection from ip: " + socket.getInetAddress());

                   } catch (Exception ex) 
                     {
                       System.out.println("Can't accept client connection: "+ex);
                     }

                try 
                   {
                     is = socket.getInputStream();
                     dataOutputStream = new DataOutputStream(socket.getOutputStream());

                     bufferSize = socket.getReceiveBufferSize();

                   }
                     catch (IOException ex) 
                       {
                         System.out.println("Can't get socket input stream. ");
                       }

                try 
                   {
                     fos = new FileOutputStream(path);
                     bos = new BufferedOutputStream(fos);

                   }
                     catch (FileNotFoundException ex) 
                      {
                        System.out.println("File not found. ");
                      }

                byte[] bytes = new byte[bufferSize];

                int count;
                System.out.println("Receiving Transfer File!.");

                while ((count = is.read(bytes)) > 0) 
                  {
                     bos.write(bytes, 0, count);
                  }

                System.out.println("File Successfully Received!.");
                fos.close();
                bos.flush();
                bos.close();
                is.close();

                result= obj.searchIndex();
                System.out.println("Found: "+result); //This correctly print the found value

                dataOutputStream.writeUTF(result);
                dataOutputStream.flush();
                dataOutputStream.close();

                System.out.println("Data sent back to the Android Client. ");


           } catch (IOException e) 
              {
               // TODO Auto-generated catch block
               e.printStackTrace();
              }

      } // receivingFile() ends

誰かが私を助けてくれれば、本当に感謝します。おそらくバッファとソケットに関連するものだと思います。私のJavaサーバーアプリは例外をスローします:「Closed Socket」...お時間をいただきありがとうございます。

アルベルト。

4

1 に答える 1

1

あなたの問題は、 を閉じるoutputstream前にを閉じることだと思いますinputstream。これはアンドロイドのバグです。通常、Java を閉じるとデータがフラッシュoutputstreamされるだけ で、 inputstreamを閉じると接続が閉じられます。しかし、アンドロイドを閉じると、接続が閉じます。そのため、閉じたソケット例外が発生しています 。ステートメントを入れてください

outputstream

out.flush();
 out.close();


result=in.readLine();

または、これらのステートメント (out.flush および out.close) を避けるだけです。私も同様の問題に直面していました。私の質問を見てください

于 2012-10-30T08:54:30.987 に答える