Исключение закрытого сокета?

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

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

}

Моя логика тоже здесь...

            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

может кто-нибудь помочь мне здесь? Любой орган может сказать мне, что мне здесь не хватает в коде?


person Nadeem Yousaf    schedule 19.09.2014    source источник


Ответы (2)


Во-первых, лучше начать AsyncTask с onStartCommand(), а во-вторых, позаботиться о методе OnDestroy.

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

Кстати: по документации Android:

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

person Ciro Rizzo    schedule 19.09.2014

Вы закрыли ServerSocket, пока он был заблокирован в accept().

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

person user207421    schedule 19.09.2014