2012-04-15 5 views
3

Ich schreibe eine Android-App, die ein Bild an einen Server mit einer Java-App sendet, und es funktioniert auf eine sehr seltsame Art und Weise! HierWeird Verhalten: Bild von Android-Handy an Java-Server senden (Code funktioniert)

ist, was ich tue

  1. Kompilieren und Ausführen die Java-Anwendung auf dem Desktop mit dem Teil erhalten, der als Server fungiert
  2. Compile, einzusetzen und zu dem Androiden Teil ausführen, um das Bild senden muss der Server. Die Android-App beendet die Ausführung, aber die Java-App nicht
  3. Führen Sie die Android-App-Aktivität, die den Code hat, um das Bild erneut zu senden, und dieses Mal, der Androide App Fortschrittdialog bleibt stecken, ABER, beendet die Java-App die Ausführung und auch das Bild übertragen wird, d erfolgreich ...

Es folgt der Code für den RECEIVE Teil des Java-App:

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(); 
     } 

    } 
} 

Es folgt der Code für den SEND Teil auf dem Android-App:

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()); 
     } 

    } 
} 

Antwort

1

Sie schließen keine der Verbindungen. Ihr Server wartet wahrscheinlich, bis die Verbindung geschlossen wird, bevor er weiß, dass die Daten gesendet wurden. Wenn Ihr Client das zweite Mal ausgeführt wird, wird die erste Verbindung wahrscheinlich automatisch von Android geschlossen, so dass Ihr Server das Bild verarbeiten kann. Wenn Ihr Server das Bild jedoch nicht schnell genug verarbeitet, bleibt Ihr Client möglicherweise beim zweiten Durchlauf hängen, da er auf die erfolgreiche Portverbindung mit dem Server wartet, der Server jedoch beschäftigt ist.

Lange Rede kurzer Sinn, wie wäre es, wenn Sie versuchen, close() die Client-Verbindung, wenn Sie damit fertig sind. Der Aufruf von flush() sagt dem Server nichts, um zu sagen, dass die Daten gesendet wurden.

Wenn Sie die Buchse wollen, offen bleiben, obwohl Sie die OutputStream schließen, könnten Sie eine benutzerdefinierte Socket schreiben, die gerade überschreibt die close() Methode, so etwas wie dieses ...

public class MySocket extends Socket { 

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

    public void close(){ 
     // do nothing 
    } 

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

in Ihrem Code ändern cliSock=new Socket(serverIP,8070);-cliSock=new MySocket(serverIP,8070);

Wenn Sie OutputStream.close() nennen, nennt es close() auf MySocket, aber wie man es sieht nicht wirklich etwas tun. Wenn Sie mit dem Socket fertig sind, können Sie MySocket.reallyClose(); anrufen und es wird es richtig schließen.

+0

Holyyy! @WATTO Studios Ich liebe dich !!!!! – GrowinMan

+0

Sie haben Recht, aber gibt es irgendeine Möglichkeit, mit der ich den Output-Stream erzwingen könnte, ohne ihn zu schließen? Weil das Schließen des Streams auch dazu führt, dass der Socket geschlossen wird, was zu einem Problem führt, wie hier beschrieben: http://stackoverflow.com/questions/10163358/socketexception-socket-is-closed-even-when-isconnected-returns- true # comment13038342_10163358 – GrowinMan

+0

Ich habe meiner obigen Antwort einen Code hinzugefügt, mit dem Sie einen 'Socket' erstellen können, der offen bleibt, obwohl 'close()' aufgerufen wird. Hoffe das hilft. – wattostudios