套接字关闭异常?

时间:2014-09-19 07:53:58

标签: android sockets serversocket socketexception

我正在使用app,我想制作一个TCP侦听器。 我搜索了许多网站寻求帮助。 我收到异常错误。 称为Socket Closed Exception。 我的代码和Log 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

有些人可以帮到我吗?任何人都可以告诉我代码中缺少什么?

2 个答案:

答案 0 :(得分:0)

ServerSocket

中阻止了accept().时,您已将其关闭

注意,零超时是无限的,永远不会导致SocketTimeoutEzception.

答案 1 :(得分:0)

首先,最好在AsyncTask上启动onStartCommand(),然后在OnDestroy方法上注意。

最好使用IntentService并在onHandleIntent()上管理您的任务,如果您需要管理单个线程任务,则更简单。

BTW:通过Android Documentations:

您应该使用服务还是线程? 即使用户没有与您的应用程序交互,服务也只是一个可以在后台运行的组件。因此,只有在您需要的时候才应创建服务。 如果您需要在主线程之外执行工作,但只有在用户与您的应用程序交互时,您应该创建一个新线程而不是服务。例如,如果您想播放一些音乐,但只有在您的活动正在运行时,您可以在onCreate()中创建一个线程,在onStart()中开始运行它,然后在onStop()中停止它。还要考虑使用AsyncTask或HandlerThread,而不是传统的Thread类。有关线程的更多信息,请参阅进程和线程文档。 请记住,如果您确实使用了服务,它默认仍然在您的应用程序的主线程中运行,因此如果它执行密集或阻塞操作,您仍应在服务中创建新线程。