2012-04-15 3 views
3

자바 애플 리케이션을 실행하는 서버에 이미지를 보내는 안드로이드 애플 리케이션을 작성 중이며 아주 이상한 방식으로 작동하고 있습니다! 여기 이상한 행동 : 안드로이드 폰에서 자바 서버로 이미지 보내기 (코드 작업)

내가

  1. 컴파일을하고
  2. 컴파일이 배포에 이미지를 전송하는 안드로이드 일부를 실행하는 서버의 역할을 일부를받을 수와 바탕 화면에 자바 응용 프로그램을 실행하는 것입니다 서버. 안드로이드 앱 실행이 끝났지 만 자바 앱이 실행되지 않는다.
  3. 이미지를 다시 보내려면 코드가있는 안드로이드 앱 활동을 실행하고, 이번에는 안드로이드 앱 진행 대화 상자가 멈추지 만 자바 앱 실행이 끝나고 안드로이드 응용 프로그램에 SEND 부분에 대한 코드

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

    다음입니다 : : 또한 이미지 전송을 성공적으로 디 ...

이 다음은 자바 응용 프로그램의 수신부에 대한 코드입니다

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

연결이 종료되지 않습니다. 서버는 데이터 전송이 완료되었음을 알기 전에 연결이 종료 될 때까지 대기 중일 수 있습니다. 클라이언트가 두 번째 실행되면 Android에서 자동으로 첫 연결을 종료하므로 서버가 이미지를 처리 ​​할 수 ​​있습니다. 그러나 서버가 이미지를 충분히 빨리 처리하지 못하면 서버에 성공적으로 포트 연결을 기다리지 만 서버가 사용 중이므로 클라이언트가 두 번째 실행에서 '멈춤'상태가됩니다.

간단히 말하면 끝내면 클라이언트 연결 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);

당신이 OutputStream.close() 전화 cliSock=new MySocket(serverIP,8070);, 그것은 MySocketclose() 호출하지만 당신이 볼 수있는 사실은 아무것도하지 않습니다. Socket으로 끝나면 MySocket.reallyClose();으로 전화하면 제대로 닫힙니다.

+0

Holyyy! @WATTO Studios 당신을 사랑합니다 !!!!! – GrowinMan

+0

당신이 옳은데, 출력 스트림을 닫지 않고 강제로 플러시 할 수있는 방법이 있습니까? 스트림을 닫으면 소켓이 닫혀서 여기에 언급 된 문제가 발생하기 때문에 http://stackoverflow.com/questions/10163358/socketexception-socket-is-closed-even-when-isconnected-returns- 사실 # comment13038342_10163358 – GrowinMan

+0

위의 답변에 몇 가지 코드를 추가 했으므로 close()가 호출 되더라도 열린 채로있는'Socket'을 만들 수 있습니다. 희망이 도움이됩니다. – wattostudios