我正在使用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
有些人可以帮到我吗?任何人都可以告诉我代码中缺少什么?
答案 0 :(得分:0)
在ServerSocket
accept().
时,您已将其关闭
注意,零超时是无限的,永远不会导致SocketTimeoutEzception.
答案 1 :(得分:0)
首先,最好在AsyncTask
上启动onStartCommand()
,然后在OnDestroy方法上注意。
最好使用IntentService
并在onHandleIntent()
上管理您的任务,如果您需要管理单个线程任务,则更简单。
BTW:通过Android Documentations:
您应该使用服务还是线程? 即使用户没有与您的应用程序交互,服务也只是一个可以在后台运行的组件。因此,只有在您需要的时候才应创建服务。 如果您需要在主线程之外执行工作,但只有在用户与您的应用程序交互时,您应该创建一个新线程而不是服务。例如,如果您想播放一些音乐,但只有在您的活动正在运行时,您可以在onCreate()中创建一个线程,在onStart()中开始运行它,然后在onStop()中停止它。还要考虑使用AsyncTask或HandlerThread,而不是传统的Thread类。有关线程的更多信息,请参阅进程和线程文档。 请记住,如果您确实使用了服务,它默认仍然在您的应用程序的主线程中运行,因此如果它执行密集或阻塞操作,您仍应在服务中创建新线程。