2014-09-19 111 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

首先是更好地启动AsyncTaskonStartCommand()和第二注意OnDestroy方法。

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

BTW:由Android之证件:

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