2015-10-18 2 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"; 
 

 
    } 
 
}

Для этого у меня есть очереди д строки, где я могу добавить строки из другого класса. Вот мой код сервера:

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
  • Возможно, вы захотите использовать BlockingQueue.

Это типичный способ реализации шаблона производитель-comsumer: производитель будет put() строки в очереди, сервер/потребитель будет take() строка из очереди. Если очередь пуста, сервер будет блокироваться и ждать, опционально с таймаутом.

Возможно, вам не понадобится связать очередь, чтобы вы могли создать экземпляр LinkedBlockingQueue с его пустым конструктором.

Все реализации BlockingQueue являются потокобезопасными, поэтому для их основных операций не требуется дополнительная синхронизация.


1. Если вам нужно атомарность и/или другие эффекты памяти, вы должны реализовать свою политику безопасности нить себя как обычно.

Смежные вопросы