2012-04-15 2 views
0

내가 만들고있어 소켓 통신을 사용하는 안드로이드 응용 프로그램이 컴퓨터 여기SocketException - 사용하고는, isConnected()가

에서 실행되는 자바 응용 프로그램에 이미지를 보낼 무슨 일이 일어나고있는 것 true를 돌려주는 경우에도 '소켓이 닫혀'바탕 화면 서버 자바 응용 프로그램을 실행 중이고 클라이언트 안드로이드 응용 프로그램이 장치에서 실행되면 이미지가 서버로 전송되고 해당 부분이 잘 돌아갑니다. 그 후 서버 응용 프로그램은 콘솔에서 행을 가져 와서 다시 Android app으로 전달합니다. TILL 메시지가 안드로이드 앱에 의해 수신되면, 진행 대화 상자가 표시되고 거기에 갇히게됩니다. 안드로이드 애플 리케이션은 readLine()을 사용하여 데스크톱 애플 리케이션에 의해 전달 된 문자열을 읽어야하지만 안드로이드 애플 리케이션에서 소켓을 통해 inputstream을 열려고 할 때 그것은 예외를 제공합니다.

다음 안드로이드 클라이언트

수입 java.net.ServerSocket에 대한 데스크탑 서버, 먼저 코드들이다; import java.net.Socket; import java.io. *;

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"); 
      System.out.println(sock.isConnected()+"1"); 

      //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"); 
      bos.close(); 
      //sock.close(); 
      //receive code ends 

      //System.out.println(br.readLine()); 


      //Matlab computation 

      //Send result 
      System.out.println(sock.isConnected()+"2"); 
      PrintWriter pr=new PrintWriter(sock.getOutputStream(),true); 

      pr.println((new BufferedReader(new InputStreamReader(System.in))).readLine()); 
      System.out.println(sock.isConnected()+"3"); 
      (new BufferedReader(new InputStreamReader(System.in))).readLine(); 
      System.out.println(sock.isConnected()+"4"); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
      e.printStackTrace(); 
     } 

    } 
} 

안드로이드 클라이언트 : 여기 BTW

package com.site.custom; 

import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.Socket; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 


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 
     //pd=ProgressDialog.show(this, "Establishing connection", "Finding server",false,true); 

     try 
     { 
      cliSock=new Socket(serverIP,8070); 

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

     //Send file 
     //Log.v("MERA MSG","changing text1"); 

     ProgressDialog pd=ProgressDialog.show(this, "Sending image", "Image chosen:"+path.substring(path.lastIndexOf("//")+1),false,true); 
     //Log.v("MERA MSG","changing text2"); 

     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(); 
      os.close(); 
      bis.close(); 
      //sock.close(); 
      //System.out.println("Completed"); 
      System.out.println(cliSock.isConnected()+"1"); 
      pd.dismiss(); 
      //System.out.println("Done"); 
      System.out.println(cliSock.isConnected()+"2"); 
      //Show dialog box till computation results arrive 
      pd=ProgressDialog.show(this, "Recognizing...", "(waiting for server reply)",false,true); 
      System.out.println(cliSock.isConnected()+"3"); 
      in=new BufferedReader(new InputStreamReader(cliSock.getInputStream())); 
      System.out.println(in.readLine()); 
      pd.dismiss(); 

     } 
     catch(Exception e) 
     { 
      Log.v("MERA MSG",e.toString()); 
      e.printStackTrace(); 
     } 



    } 
} 

그리고는 로그 캣의 로그입니다 가 http://pastebin.com/atHMycTa 당신은 그것을 선 350 및 349 봐에 진정한 같이 소켓이 아직 여기에 연결되어 있는지 확인할 수 있습니다 오류 351 행.

+0

이것이 원인 일지는 모르겠지만 소켓에서 데이터를 읽은 후'os.close()'호출을 이동하려고 할 수 있습니까? 출력 스트림을 닫으면 소켓도 닫히는 지 기억이 나지 않습니다. 아니면 입력 스트림을 닫을 때만 발생합니다. – Patrick

+0

@patrick 아니요, 내 대답을보십시오. – EJP

+0

@EJP : 아, 죄송합니다. 뭔가 다른 것과 혼동되어 있어야합니다. – Patrick

답변

2

isConnected()는이 소켓 이 연결되어 있는지 여부를 알려주므로 사용자가 가지고있는을 반환하므로 true를 반환합니다. 연결 상태를 나타내는 것은 아닙니다.

+1

감사합니다. 그러나 당신은 여전히 ​​내 문제를 해결하는 방법을 알려주지 않습니다 .. – GrowinMan

+0

@ GrowinMan 귀하의 문제는 당신이 귀하의 소켓을 폐쇄하고 그것을 계속 사용하는 것입니다. 출력 스트림을 닫으면 소켓이 닫힙니다. 그냥 플러시 한 다음 입력 스트림을 가져온 다음 계속하십시오. 또한 이러한 ByteArrayOutputStreams 중 하나가 필요하지 않습니다. 그들은 단지 시간과 공간을 낭비하고 있습니다. 파일에서 읽거나, 소켓에 쓰거나, 그 반대 * * – EJP

+0

flush 명령()이 작동하지 않는 것 같습니다. 방금 flush()를하면 서버는 여전히 이미지 수신을 기다리고 있습니다. os.close()를 수행 한 후에야 스트림이 실제로 플러시되고 서버는 이미지를 완전히 수신하고 실행을 계속 진행합니다. 출력 스트림을 닫지 않고 플러시 할 수있는 방법이 있습니까? – GrowinMan

관련 문제