2012-02-13 97 views
8

我正尝试创建一个通过套接字与本地服务器进行通信的Android应用程序。通信使用JSON传递简单的命令和字符串中的数据。客户端应该不断监听来自服务器的传入消息,并在收到新数据时更新用户界面。Android监听来自服务器套接字的消息

所以我创建了一个网络服务,这是一个在后台运行的绑定服务。从我的活动绑定到服务并接收服务对象的实例。服务对象包含允许我将命令发送到服务器的实例方法。

我的问题是,我如何使我的服务不断侦听来自服务器的消息,而不会阻止将消息发送到服务器的可能性?

private Socket socket = null; 
private PrintWriter out = null; 
private BufferedReader in = null; 

private Listener listener; 

private String host = "10.0.1.4"; 
private int port = 3000; 

public NetworkService() 
{ 
    try { 

     if (socket == null) 
     { 
     socket = new Socket(this.host, this.port); 
     out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     } 

     if(listener == null) 
     { 
      listener = new Listener(); 
      Thread thread = new Thread(listener); 
      thread.start(); 
     } 

     } catch (Exception e) { 
      // ... 
     } 
    } 
} 

public class Listener implements Runnable 
{ 

    @Override 
    public void run() { 

     try { 
      String line = null; 

      while((line = in.readLine()) != null) 
       { 
       // Do something. Never gets here 

       } 
      } catch (Exception e) { 
       // ... 
      } 

     } 

    } 
+0

笏你的意思。做ü希望在应用程序正在运行或在特定时间段或当应用程序处于静音模式(当应用程序正在运行背景)... – Sniper 2012-02-13 10:21:08

+0

好了,我需要的服务是可用来运行这些程序,每当我正在使用应用程序。我需要能够发送简单的字符串命令到服务器,我需要能够从服务器接收数据。 – 2012-02-13 10:26:18

+0

你想获得的反应形式的服务器,直到您的应用程序的结束或在特定时间段.. – Sniper 2012-02-13 10:32:26

回答

4

您可以在服务中创建一个线程来侦听服务器。第二个线程用于发送命令。然后,为了您的服务,您应该创建一个带有处理程序的主线程。该处理程序将处理来自这两个线程的消息。

+0

这也是我的第一个念头。我尝试在构造函数中为我的服务启动一个新的线程,并在输入流上使用readline进行阻塞,但while循环似乎立即终止。请参阅我的编辑 – 2012-02-13 12:45:26

+0

好吧,删除所有内容并再次尝试此方法。现在它可以工作。 – 2012-02-13 13:24:53