使用服务的TCP连接

时间:2015-03-05 10:54:59

标签: android service tcp connection client

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

1 个答案:

答案 0 :(得分:3)

阅读澄清后:

  • 使用IntentService本身就可以了。请注意,IntentService创建一个工作线程来处理传入的意图。
  • 在您的服务启动时创建套接字,或在第一次收到Intent时懒洋洋地创建套接字。每次收到当前的新意图时,请勿重新连接/重新创建套接字。只需重新使用现有的套接字即可。但是,您可能希望在连接断开时添加对重新连接套接字的支持(即,当您获得IOError时)。懒惰地创建套接字可能更好,因为您将在正确的线程(即意图处理程序线程)中执行此操作。见下文。
  • 您不需要单独的线程来等待传入的数据。只需在您已经免费获得的意图处理程序线程中执行此操作。传入的意图将排队,您的服务将一个接一个地处理它们。
  • 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()。要使用它,请为BroadcastReceiver注册Activity Context.registerReceiver()BroadcastReceiver将收到与过滤条件匹配的所有Intent。通常的方法是为Intent提供一个唯一的操作名称并按此过滤。

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