使用服务的TCP连接

ste9206

我必须实现一个应用程序。该应用程序使用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,这是错误的吗?感谢您的帮助。

ke

阅读您的说明后:

  • 使用IntentService本身就很好。请注意,将IntentService创建一个工作线程来处理传入的意图。

  • 在服务启动时或第一次收到消息时懒惰地创建套接字Intent当您每次收到新的意图时,不要像现在那样重新连接/重新创建套接字。只需重新使用现有的套接字即可。但是,当连接断开时(例如,当您收到时IOError,您可能想增加对重新连接套接字的支持最好延迟创建套接字,因为您将在正确的线程(即意图处理器线程)中进行操作。见下文。

  • 您不需要单独的线程来等待传入数据。只需在您已经免费获得的意图处理程序线程中执行此操作即可。传入的意图将排队,并且您的服务将一个接一个地处理它们。

  • AsyncTask对许多人来说有点混乱。postDelayed()AsyncTasks不同,它是真正的后台操作,带有用于同步框架操作的附加挂钩。最初,AsyncTasks在单独的线程中异步执行。DONUT引入了一个线程池,而HONEYCOMB回到了单个线程,从而避免了常见的竞争情况。

    服务有所不同。创建新服务并不意味着该服务确实在其自己的线程中运行。相反,对于典型的用例,正在创建的主线程Activity和新创建Service的线程共享同一线程,等待传入消息。在UI线程上执行阻止(例如,网络IO)操作是确保您的应用程序无响应的肯定方法(这就是Android默认情况下阻止它的原因)。

  • 对于保持活动,您可以Handler.postDelayed()在服务中简单使用(请参阅Android定期运行Task)。如果您在Intent处理程序线程上创建处理程序(即为您创建的处理程序IntentService),您甚至不必担心并发访问。

  • 将服务中的回复发送回任何意图发送者的最简单方法是使用Context.sendBroadcast()要使用它,请向注册BroadcastReceiverActivityContext.registerReceiver()BroadcastReceiver将接收所有Intent符合筛选条件的秒。通常的方法是为和设置一个唯一的动作名称Intent

[编辑]更正有关AsyncTask处理的主张

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章