android – 使用Service的TCP连接

android – 使用Service的TCP连接,第1张

概述我必须实现一个应用程序.此应用程序使用TCP / IP与服务器通信.我的应用程序必须向服务器请求位置.因为应用程序必须保持监听服务器请求,我认为使用IntentService.所以我实现它: public class Tasks extends IntentService{public final int SERVERPORT = 8100;private Socket socket;Pri 我必须实现一个应用程序.此应用程序使用TCP / IP与服务器通信.我的应用程序必须向服务器请求位置.因为应用程序必须保持监听服务器请求,我认为使用IntentService.所以我实现它:

public class Tasks extends IntentService{public final int SERVERPORT = 8100;private Socket socket;PrintWriter out;BufferedReader in;public Tasks(){    super("My task!");}protected voID onHandleIntent(Intent intent){    try    {        InetAddress serverAddr = InetAddress.getByname("10.0.0.138");        socket = new Socket(serverAddr,SERVERPORT);        out = new PrintWriter(socket.getoutputStream());        //send the request to authenticate it        out.print("Hello man");        out.flush();        //Now i need to receive the request Hello_ACK        in = new BufferedReader(new inputStreamReader(socket.getinputStream()));        String mServerMessage = in.readline();        if(mServerMessage.equals("Hello_ACK"))         Log.d("show","connection completed");        //Now how can I send KEEP_AliVE message to server?        out.print("KEEP_AliVE");        out.flush();    }    catch (IOException e)    {        e.printstacktrace();    }   }  }

我想问你一些问题:
1. IntentService如何维护与服务器的TCP连接
2.每隔5分钟,我必须向服务器发送“KEEP_AliVE”消息.我可以把它放进去吗?
3.我已实现此任务以维持与服务器的连接;为了在服务器上调用位置,我是否要使用新线程(例如新类扩展Runnable)?
4.使用asynctask做同样的工作是不对的?
5.为了与主UT通信,我要实现一个RegisterReceiver,这是错误的?
谢谢您的帮助.

解决方法 阅读完澄清后:

>使用IntentService本身就很好.请注意,IntentService创建一个工作线程来处理传入的意图.
>在您的服务启动时创建套接字,或在第一次收到Intent时懒洋洋地创建套接字.每次收到当前的新意图时,请勿重新连接/重新创建套接字.只需重新使用现有的套接字即可.但是,您可能希望在连接断开时添加对重新连接套接字的支持(即,当您收到IOError时).懒惰地创建套接字可能更好,因为您将在正确的线程(即intent处理程序线程)中执行它.见下文.
>您不需要单独的线程来等待传入的数据.只需在您已经免费获得的意图处理程序线程中执行此 *** 作.传入的意图将排队,您的服务将一个接一个地处理它们.
> AsyncTask对许多人来说有点混乱.与postDelayed()不同,AsyncTasks是真正的后台 *** 作,具有用于同步框架 *** 作的附加钩子.最初,AsyncTasks在一个单独的线程中异步执行. DONUT引入了一个线程池,HONEYCOMB又回到单个线程,以避免常见的竞争条件.

服务有点不同.创建新服务并不意味着该服务确实在其自己的线程中运行.相反,对于典型的用例,创建主Activity和新创建的Service共享同一个线程,等待传入消息.在UI线程上执行阻止(例如网络IO) *** 作是使应用程序无响应的可靠方法(这就是AndroID prevents it by default的原因).
>对于保持活动,您可以在服务中使用Handler.postDelayed(). (见Android run a Task Periodically).如果您在Intent处理程序线程(即IntentService为您创建的那个)上创建处理程序,您甚至不必担心并发访问.
>将回复从您的服务发送回任何意图发送者的最简单方法是使用Context.sendbroadcast().要使用它,请使用Context.registerReceiver()为您的Activity注册broadcastReceiver. broadcastReceiver将接收与过滤器匹配的所有Intent.通常的方法是为Intent提供一个唯一的动作名称并按此过滤.

[编辑]纠正有关AsyncTask处理的声明.

总结

以上是内存溢出为你收集整理的android – 使用Service的TCP连接全部内容,希望文章能够帮你解决android – 使用Service的TCP连接所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1127777.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存