2014-09-19 5 views
0

Я работаю над приложением, я хочу сделать прослушиватель TCP. Я искал много сайтов для помощи. Я получаю ошибку исключения. Вызывается закрытая розетка. Ниже приведен код кода и журнала.Закрытое закрытие Исключение?

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

Вы закрыли ServerSocket в то время как он был заблокирован в accept().

NB нулевой тайм-аут бесконечна и никогда не заставит SocketTimeoutEzception.

0

Прежде всего, это лучше, чтобы начать свой AsyncTask на onStartCommand() и в качестве второго позаботьтесь о методе OnDestroy.

Лучше использовать IntentService и управлять своей задачей на onHandleIntent(), проще, если вам нужно управлять одной задачей потока.

КСТАТИ: по Android Documentations:

Если вы используете услугу или нить? Служба - это просто компонент, который может работать в фоновом режиме, даже если пользователь не взаимодействует с вашим приложением. Таким образом, вы должны создать услугу, только если это то, что вам нужно. Если вам нужно выполнить работу вне основного потока, но только в то время, когда пользователь взаимодействует с вашим приложением, тогда вам, вероятно, следует вместо этого создать новый поток, а не службу. Например, если вы хотите воспроизвести какую-либо музыку, но только во время работы, вы можете создать поток в onCreate(), запустить его в onStart(), а затем остановить его в onStop(). Также рассмотрите использование AsyncTask или HandlerThread вместо традиционного класса Thread. Дополнительную информацию о потоках см. В документе Процессы и Threading. Помните, что если вы используете услугу, она по-прежнему работает в основном потоке вашего приложения по умолчанию, поэтому вы должны создать новый поток в службе, если он выполняет интенсивные или блокирующие операции.