2015-10-18 108 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.如果你需要原子和/或其他記憶效應,你必須自己實現你的線程安全政策如常。