2013-04-10 3 views
0

ребята! Я написал приложение простого сервера (udp). Теперь я пытаюсь сделать сервер, который принимает много клиентов. Поскольку, я понял, мне нужно создавать функции, которые принимают и обрабатывают клиентов, но я запутался в структуре приложений. Могу ли я проверить, есть ли у меня правильный скелет для моего приложения? Mayb u может дать мне некоторый намек или пример. Все советы были оценены! :)сервер обработки многих клиентов java

class MultiServer { 

    private DatagramSocket serversocket; 

    public MultiServer() { 
     try { 
      this.serversocket = new DatagramSocket(6789); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void start() throws IOException { 
     while(true) { 
      DatagramSocket serversock = serversocket.accept(); 
      new Thread(new ClientHandler(serversock)).start(); 
     } 
    } 

    public static void main(String[] args) { 
     Server1 server = new Server1(); 
     try { 
      server.start(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

class ClientHandler implements Runnable { 

     private final DatagramSocket clientsocket; 

     ClientHandler(DatagramSocket sock) { 
      this.clientsocket = sock; 
     } 

     @Override 
     public void run() { 
      //receive packet, send msg, get ip, get portnumber ? 
     } 

    } 

} 

ответ

0

Вы ищете сервер, управляемый потоками. То, как вы начали, хорошо. Теперь вы просто реализуете службу выполнения Java для обработки запросов. В threadpool есть фиксированный поток. Он принимает ваши запросы и помещает их в очередь, и если запрос выполняется, он принимает следующий запрос. Поэтому вы нормально не теряете никаких запросов.

Вот небольшой пример я сделал:

public class PoolServer implements Runnable { 
    private static final int DEFAULT_PORT = 8080; 
    private static final String CONFIG = "config.xml"; 
    protected ServerSocket serverSocket = null; 
    protected boolean isStopped = false; 
    protected Thread runningThread = null; 
    protected ExecutorService threadPool = Executors.newFixedThreadPool(100); 
    protected int serverPort; 

    public PoolServer() { 
     // getting the port from the XML 
     this.serverPort = getPortFromXML(); 
    } 

    public void run() { 
     synchronized (this) { 
      this.runningThread = Thread.currentThread(); 
     } 
     openServerSocket(); 
     // accepting loop 
     while (!isStopped()) { 
      Socket clientSocket = null; 
      try { 
       // accept the client 
       clientSocket = this.serverSocket.accept(); 
       clientSocket.setSoTimeout(2000); 

      } catch (IOException e) { 
       if (isStopped()) { 
        return; 
       } 
       throw new RuntimeException("Error accepting client connection", 
         e); 
      } 
      this.threadPool.execute(new ThreadHandler(clientSocket)); 
     } 
     // loop end 
     // server stopped shut down the ThreadPool 
     this.threadPool.shutdown(); 
    } 

    private synchronized boolean isStopped() { 
     return this.isStopped; 
    } 

    public synchronized void stop() { 
     this.isStopped = true; 
     try { 
      this.serverSocket.close(); 
     } catch (IOException e) { 
      throw new RuntimeException("Error closing server", e); 
     } 
    } 

    private void openServerSocket() { 
     try { 
      this.serverSocket = new ServerSocket(this.serverPort); 
     } catch (IOException e) { 
      throw new RuntimeException("Cannot open port " + this.serverPort, e); 
     } 
    } 

На этом этапе this.threadPool.execute(new ThreadHandler(clientSocket)); я сделать выполнить запрос, если поток свободен. Иначе он попадает в очередь Threadpool.

Вы даже можете изменить его с фиксированного на некоторые другие каналы Threadpool! Просто взгляните на Исполнителей и возьмите то, что вам нужно. Executors
Надеюсь, это поможет!

+0

спасибо, я попробую;) – chajka

1

Вы хотите, чтобы ваш сервер мог работать с несколькими запросами одновременно? Хорошо, так работает большинство веб-серверов. Вы должны понимать основные концепции многопоточности и параллелизма.

Простой сервер может обрабатывать только одну вещь за раз. Что произойдет, если другой запрос получен, когда сервер имеет дело с чем-то другим? Ничего, поэтому приложение не очень эффективно и не масштабируется вообще.

Если вы еще не использовали несколько потоков в своих приложениях и не знаете много о параллелизме, отлично провести время, прочитать Oracle Concurrency Lesson или найти учебник онлайн, их много.

Теперь, когда (или если) вы знаете, как работают потоки, убедитесь, что вы как можно больше разбиваете свои функции и видите, какие функции могут выполняться одновременно. Пример веб-сервера, который я могу придумать, таков:

  • Отдельный поток для прослушивания порта для запросов. После получения запроса, поместить его в «запрос пула» и очереди ее обработки
  • отдельный поток (или несколько потоков/пул потоков), которые обрабатывают запрос

Ваша структура выглядит как у вас есть как получать, так и обрабатывать в том же Runnable. Во всяком случае, это всего лишь идея, вам нужно будет увидеть, что более применимо к вашему приложению. Кроме того, посмотрите на инструменты параллелизма, которые предоставляют более новые версии Java, Java 6 и 7 предоставляют множество инструментов, которые вы можете использовать, которые очень эффективны (но также довольно трудно понять и использовать по моему мнению).

Удачи вам!

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