2012-04-15 6 views
3

私はJavaアプリケーションを実行しているサーバーに画像を送信するアンドロイドアプリを作成しています。ここで奇妙な行動:Android携帯からJavaサーバーに画像を送信する(コード作業)

私は

  1. コンパイル何であるとに画像を送信するために持っているアンドロイド一部を展開し、実行し、コンパイル
  2. サーバーとして動作する受信部分で、デスクトップ上でJavaアプリケーションを実行しますサーバー。アンドロイドアプリは実行を終了しますが、Javaアプリは終了しません
  3. イメージを送信するコードを持つアンドロイドアプリアクティビティを実行し、今回はアンドロイドアプリの進捗ダイアログが表示されなくなりますが、Javaアプリは実行を終了しますまた、画像が転送され、正常dが...

後は、Javaアプリの一部を受け取るためのコードです:後

class ProjectServer 
{ 
    ServerSocket serSock; 
    Socket sock; 

    BufferedReader in; 
    PrintWriter out; 
    public static void main(String ar[]) 
    { 
     try 
     { 
      ProjectServer cs=new ProjectServer(); 
      cs.startServer(); 
     } 
     catch(Exception e) 
     { 

     } 
    } 

    public void startServer() 
    { 
     try 
     { 
      serSock=new ServerSocket(8070); 
      System.out.println("Waiting for client..."); 
      sock=serSock.accept(); 

      System.out.println("Connections done"); 

     //Accept File 
      System.out.println("Connected"); 

      //receive code 
      int filesize=450660; 
      int bytesRead; 
      int current=0; 
      // receive file 
      byte [] mybytearray = new byte [filesize]; 
      InputStream is = sock.getInputStream(); 
      FileOutputStream fos = new FileOutputStream("C:\\Project Server\\Capture.png"); 
      BufferedOutputStream bos = new BufferedOutputStream(fos); 
      bytesRead = is.read(mybytearray,0,mybytearray.length); 
      current = bytesRead; 

      do { 
       bytesRead = 
        is.read(mybytearray, current, (mybytearray.length-current)); 
       if(bytesRead >= 0) current += bytesRead; 
      } while(bytesRead > -1); 

      bos.write(mybytearray, 0 , current); 
      bos.flush(); 

      System.out.println("end-start");  
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
      e.printStackTrace(); 
     } 

    } 
} 

は、AndroidアプリのSENDパートのコードです:

package com.site.custom; 
public class Act2 extends Activity 
{ 
    private ProgressDialog pd; 
    private String serverIP="58.146.100.187"; 
    private BufferedReader in; 
    private PrintWriter out; 
    private String path; 
    private Socket cliSock; 

    public void onCreate(Bundle onCreateInstance) 
    { 
     super.onCreate(onCreateInstance); 
     setContentView(R.layout.act2); 
     this.setTitle("This has started"); 
     path=getIntent().getStringExtra("path"); 

     //Establish Connection 
     try 
     { 
      cliSock=new Socket(serverIP,8070); 
      in=new BufferedReader(new InputStreamReader(cliSock.getInputStream())); 

      ((TextView)findViewById(R.id.tview)).setText(path); 
     } 
     catch(Exception e) 
     { 
      Log.v("MERA MSG",e.toString()); 
     } 

     //Send file 
     ProgressDialog pd=ProgressDialog.show(this, "Sending image", "Image chosen:"+path.substring(path.lastIndexOf("//")+1),false,true); 

     try 
     { 
      File myFile = new File (path); 
      System.out.println((int)myFile.length()); 
      byte[] mybytearray = new byte[450560]; 
      FileInputStream fis = new FileInputStream(myFile); 
      BufferedInputStream bis = new BufferedInputStream(fis); 
      bis.read(mybytearray,0,mybytearray.length); 
      OutputStream os = cliSock.getOutputStream(); 
      System.out.println("Sending..."); 
      os.write(mybytearray,0,mybytearray.length); 
      os.flush(); 
      System.out.println("Completed"); 

      pd.dismiss(); 
      System.out.println("Done"); 
     } 
     catch(Exception e) 
     { 
      Log.v("MERA MSG",e.toString()); 
     } 

    } 
} 

答えて

1

接続が終了していません。データの送信が完了する前に、接続が閉じられるまでサーバーが待機している可能性があります。クライアントが2回目に実行されると、最初の接続がAndroidによって自動的に閉じられるため、サーバーでイメージを処理できます。ただし、サーバーがイメージを十分に高速で処理しない場合、サーバーへの正常なポート接続を待っているのにサーバーはビジー状態であるため、クライアントは2回目に「スタック」することがあります。

あなたがそれを終えたらclose()クライアント接続を試してみてはいかがですか? flush()を呼び出すと、データの送信が完了したことをサーバーに知らせることは実際にはありません。

あなたはソケットは、あなたがOutputStreamを閉じていても開いたままにしたい場合は、あなただけのclose()方法、このような何かを上書きするカスタムSocketを書くことができます...あなたのコードで

public class MySocket extends Socket { 

    public MySocket(String ipAddress, int port){ 
     super(ipAddress,port); 
    } 

    public void close(){ 
     // do nothing 
    } 

    public void reallyClose(){ 
     super.close(); 
    } 
} 

、変更cliSock=new Socket(serverIP,8070);cliSock=new MySocket(serverIP,8070);

あなたがOutputStream.close()を呼び出すと、それはMySocketclose()を呼び出しますが、あなたが見ることができるとして、それは実際には何もしません。 Socketで完全に終了したら、MySocket.reallyClose();に電話すると正しく終了します。

+0

Holyyy! @ WATTO Studios私はあなたを愛しています!!!!! – GrowinMan

+0

あなたは正しいですが、出力ストリームを強制的に閉じずにフラッシュすることができる方法はありますか?ストリームを閉じるとソケットが閉じて、ここで述べたような問題を引き起こしているからです:http://stackoverflow.com/questions/10163358/socketexception-socket-is-closed-even-when-isconnected-returns- true#comment13038342_10163358 – GrowinMan

+0

上記の答えにいくつかのコードを追加しました。これは、 'close()'が呼び出されても開いたままの 'Socket'を作成できるようにします。お役に立てれば。 – wattostudios

関連する問題