2014-09-19 3 views
0

나는 애플 리케이션에서 일하고, 나는 TCP 수신기를 만들고 싶어. 많은 사이트에서 도움을 요청했습니다. 예외 오류가 발생합니다. 호출 된 소켓 종료 예외. MY 코드 및 로그 고양이가 아래에 주어집니다.소켓 폐쇄 된 예외?

public class ListenerService extends Service { 

//Socket socket; 
private ServerSocket serverSocket; 
BufferedReader in = null; 
static String message=null; 
int portNo=1619; 
boolean flag=true; 
final static String MY_ACTION = "MY_ACTION"; 
@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
    new Task().execute(); 

} 

@Override 
    public void onDestroy() { 
    super.onDestroy(); 
    flag = false; 
    if (serverSocket != null) { 
     try { 
      serverSocket.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    stopSelf(); 
    Log.d("Server Stoped", "Listener Serverice is Stoped"); 
    // Toast.makeText(this, "Listener Destroyed", Toast.LENGTH_LONG).sho 
    } 
    private class Task extends AsyncTask <Void, String, String> { 
     @Override 
     protected String doInBackground(Void... params) {  
     try { 
      serverSocket = new ServerSocket(portNo); 
      serverSocket.setSoTimeout(0); 
      while (flag) { 
       try { 
        Socket clientSocket = serverSocket.accept(); 
        BufferedReader inputReader = new BufferedReader(
          new InputStreamReader(
            clientSocket.getInputStream())); 
        System.out.println("Client said :" 
          + inputReader.readLine()); 
        message = inputReader.readLine(); 
        Log.d("NETWORK-RECEIVE", "Message!:" + message); 
        publishProgress(message); 


        clientSocket.close(); 

       } catch (SocketTimeoutException e) { 
        e.printStackTrace(); 
       } 
      } 

     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } finally { 
      try { 
       if (serverSocket != null) { 
        serverSocket.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return message; 
    } 
     @Override 
     protected void onProgressUpdate(String... values) { 
      // TODO Auto-generated method stub 
      super.onProgressUpdate(values); 
      Intent i = new Intent(); 
      i.setClass(getApplicationContext(), MainActivity.class); 
      i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      i.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);           
      startActivity(i); 
      messageSend(message); 
     } 



    } 
    protected void messageSend(String values) {    
      Log.d("AFTER", values); 
      Intent intent = new Intent(); 
      intent.setAction(MY_ACTION); 
      intent.putExtra("message", values);    
      sendBroadcast(intent);    
     } 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub 
    Log.d("Server Startd","Listener Serverice is running"); 
    //Toast.makeText(getApplicationContext(),"Service Started", Toast.LENGTH_LONG).show(); 
    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

} 

내 logcate는

  09-19 12:51:07.229: D/Server Stoped(17878): Listener Serverice is Stoped 
      09-19 12:51:07.229: W/System.err(17878): java.net.SocketException: Socket closed 
      09-19 12:51:07.239: W/System.err(17878): at libcore.io.Posix.accept(Native Method) 
      09-19 12:51:07.239: W/System.err(17878): at libcore.io.BlockGuardOs.accept(BlockGuardOs.java:55) 
      09-19 12:51:07.239: W/System.err(17878): at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:98) 
      09-19 12:51:07.239: W/System.err(17878): at java.net.ServerSocket.implAccept(ServerSocket.java:202) 
      09-19 12:51:07.239: W/System.err(17878): at java.net.ServerSocket.accept(ServerSocket.java:127) 
      09-19 12:51:07.239: W/System.err(17878): at com.vigosol.tcplistener.ListenerService$Task.doInBackground(ListenerService.java:88) 
      09-19 12:51:07.239: W/System.err(17878): at com.vigosol.tcplistener.ListenerService$Task.doInBackground(ListenerService.java:1) 
      09-19 12:51:07.239: W/System.err(17878): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
      09-19 12:51:07.239: W/System.err(17878): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
      09-19 12:51:07.249: W/System.err(17878): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
      09-19 12:51:07.249: W/System.err(17878): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
      09-19 12:51:07.249: W/System.err(17878): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
      09-19 12:51:07.249: W/System.err(17878): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
      09-19 1 

일부가 여기에 나를 도울 수 ... 또한 여기에있다? 모든 몸은 내가 코드 여기에 놓치고 무엇을 말해 줄 수?

답변

0

당신은 폐쇄 한 ServerSocketaccept().

NB에서 차단 동안 제로 타임 아웃이 무한하고 모두의 SocketTimeoutEzception.

0

먼저 당신의 AsyncTaskonStartCommand()에하고 초를 시작하는 것이 좋습니다 일으킬하지 않습니다 OnDestroy 메서드를주의하십시오.

IntentService을 사용하고 onHandleIntent()에서 작업을 관리하는 것이 단일 스레드 작업을 관리해야하는 경우 더 간단합니다. BTW

는 안드로이드 자료 문서에서 :

당신은 서비스 또는 스레드를 사용해야합니까? 서비스는 사용자가 응용 프로그램과 상호 작용하지 않는 경우에도 백그라운드에서 실행할 수있는 구성 요소입니다. 따라서 필요한 경우에만 서비스를 만들어야합니다. 사용자가 응용 프로그램과 상호 작용하는 동안에 만 주 스레드 외부에서 작업을 수행해야하는 경우 서비스가 아닌 새 스레드를 만들어야합니다. 예를 들어, 음악을 재생하면서 활동이 실행되는 동안에 만 onCreate()에서 스레드를 만들고 onStart()에서 실행 한 다음 onStop()에서 중지 할 수 있습니다. 전통적인 Thread 클래스 대신 AsyncTask 또는 HandlerThread를 사용하는 것도 고려하십시오. 스레드에 대한 자세한 내용은 프로세스 및 스레딩 문서를 참조하십시오. 서비스를 사용하는 경우 기본적으로 응용 프로그램의 기본 스레드에서 계속 실행되므로 집중 또는 차단 작업을 수행하는 경우에도 서비스 내에 새 스레드를 만들어야합니다.