2014-01-18 3 views
0

Good Day,TCP ThreadPool (адрес уже используется)

Я реализовал threadpool, который принимает Runnable Object. В принципе, я строю простую реализацию сервера, которая должна обрабатывать запросы. Код:

public static void main(String[] args) { 

    // Assign your no. of thread to create 
    int noOfProcess = 5; 
    // Assign your own thread pool size 
    int poolMaxSize = 2; 

    // Creating Threadpool with the thread size given above 
    MyThreadPool threadPool = new MyThreadPool(poolMaxSize); 
    // Creating threadpool Object 
    ThreadPoolTester obj = new ThreadPoolTester(); 

    for (int i = 0; i < noOfProcess; i++) { 
     threadPool.process(obj.startProcess(i)); 
    } 

    // Finally waiting for all thread to complete its process 
    threadPool.join(); 
} 

private Runnable startProcess(final int taskID) { 
    return new Runnable() { 
     public void run() { 
      System.out.println("Task " + taskID + ": start"); 

      ServerSocket server; 
      try { 
       server = new ServerSocket(8080); 
       while (true) { 
        final Socket connection = server.accept(); 
        handle(connection); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      System.out.println("Task " + taskID + ": end"); 
     } 
    }; 
} 

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

Что я хочу знать, каков правильный способ справиться с этим? Как серверы обычно это делают? Вы просто фиксируете исключение и продолжаете цикл, пока поток не завершит задачу? Есть ли способ заставить поток спать, пока он не сможет принять прием?

Как бы мне было 5 клиентов сделать запрос одновременно, и каков будет фактический рабочий процесс?

ответ

1

Следующая строка создает ServerSocket и связывает его с портом 8080:

server = new ServerSocket(8080); 

Как вы это делаете внутри Runnable, вы создаете несколько ServerSockets для одного порта, если вы используете несколько потоков! Вот почему вы получаете исключение - порт уже используется.

Вам не нужно создавать несколько ServerSockets, если вы хотите обрабатывать несколько клиентских запросов параллельно. Используйте пул потоков внутри метода handle:

public static void main(String[] args) throws Exception 
    // Creating Threadpool with the thread size given above 
    ExecutorService executor = Executors.newFixedThreadPool(5); 

    ServerSocket server = new ServerSocket(8080); 
    while (true) { 
     Socket socket = server.accept(); 
     handleAsync(executor, socket); 
    } 
} 

private void handleAsync(ExecutorService executor, final Socket socket) { 
    executor.execute(new Runnable() { 
     public void run() { 
      handle(socket); 
     } 
    }; 
} 

private static void handle(Socket socket) { 
    // TODO: communicate with client using socket 
} 

Смотрите также ExecutorService для другого примера сервера. Еще один turial - Thread Pooled Server от Jakob Jenkov.

+0

Got it. Необходимо только создать серверный сокет. Благодаря! – raaj

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