2015-10-18 97 views
1

大家好,我正在编写我的Android应用程序中的服务器套接字。它应该只允许一个客户端。有趣的是,我希望我的服务器在客户端可用时向客户端发送消息(字符串)。我有一串字符串,我希望我的服务器通过一个字符串尝试将字符串发送给客户端,如果队列空不发送,并且只要某些字符串被推入队列发送它。 这是我如何做到这一点:Java中的服务器套接字(Android)

public class Resource { 
 
    public static Queue<String> q = new LinkedList<String>(); 
 

 

 
    public static synchronized void addString(String commands) {//for reader 
 
     semaphore.add(commands); 
 
    } 
 

 
    public synchronized String getString() { 
 
     if (!semaphore.isEmpty()) { 
 
      return semaphore.remove(); 
 
     } else return "0"; 
 

 
    } 
 
}

对于我有串队列q其中我可以从另一个类添加字符串。这里是我的服务器代码:

new Thread(new Runnable() { 
 
      @Override 
 
      public void run() { 
 
       while (true) { 
 
        try { 
 
         // Listens for a connection to be made to this socket. 
 
         Socket socket = my_serverSocket.accept(); 
 
         //send message to client 
 
         PrintWriter out = new PrintWriter(socket.getOutputStream(), true);        
 
         out.println("1"); 
 

 
         BufferedReader in = new BufferedReader(new InputStreamReader(socket 
 
           .getInputStream())); 
 
         String msg = in.readLine(); 
 
         System.out.println("message is: " + msg); 
 

 
         // tidy up 
 
         //in.close(); 
 
         //socket.close(); 
 
        } catch (IOException ioe) { 
 
         ioe.printStackTrace(); 
 
        } catch (SecurityException se) { 
 
         se.printStackTrace(); 
 
        } 
 
       } 
 
      } 
 
     }).start();
在这里,我想我的发球检查,如果队列为空,如果没有得到一个字符串,发送到客户端,并infinetely重复这一过程。这就像生产者消费者问题。我也有兴趣做我需要使用同步。是否有可能以竞赛状态结束?

回答

1

这是实现生产者comsumer模式的典型方式:生产者将put()在队列中的字符串,服务器/客户将take()队列中的字符串。如果队列为空,则服务器将阻塞并等待(可能会有超时)。

您可能不需要绑定队列,因此您可以使用其空构造函数实例化LinkedBlockingQueue

BlockingQueue的所有实现都是线程安全的,因此您的基本操作不需要额外的同步。


1.如果你需要原子和/或其他记忆效应,你必须自己实现你的线程安全政策如常。