Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 24

TCP сервер на Java. Пул потоков

29.01.2016, 16:45. Показов 3308. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Реализовываю на JAVA TCP сервер.
Задача такова: принять сообщение от клиента, вывести на экран.
Но клиентов может быть тысяча, может быть больше.
Хочется реализовать пул потоков.
Задача такова: клиент коннектится, ждет освобождения одного из потоков (а потоков в пуле максимум 4, например).
После освобождения потока клиент обрабатывается в нем. После чего происходит разрыв соединения и освобождение потока.
У меня реализована часть, но без использования пула.
Как реализовать именно определенное (максимальное) кол-во потоков, и ожидание освобождения одного из них?
Надеюсь на помощь..
Вот код с обычными потоками:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.io.*;
import java.net.*;
 
class SampleServer extends Thread
{
    Socket s;
    int num;
 
    public static void main(String args[])
    {
        try
        {
            int i = 0; 
            ServerSocket server = new ServerSocket(9541);
            System.out.println("server is started");
            while(true)
            {
                new SampleServer(i, server.accept());
                i++;
            }
        }
        catch(Exception e)
        {System.out.println("init error: "+e);} 
    }
 
    public SampleServer(int num, Socket s)
    {
        this.num = num;
        this.s = s;
        setDaemon(true);
        setPriority(NORM_PRIORITY);
        start();
        System.out.println("Client was connected");
    }
 
    public void run()
    {
        try
        {
            InputStream is = s.getInputStream();
            OutputStream os = s.getOutputStream();
            byte buf[] = new byte[64*1024];
            int r = is.read(buf);
            String data = new String(buf, 0, r);
            data = ""+num+": "+"\n"+data;
            os.write(data.getBytes());
            System.out.println(data);
            s.close();
        }
        catch(Exception e)
        {System.out.println("init error: "+e);} 
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.01.2016, 16:45
Ответы с готовыми решениями:

Поиск файла клиент-сервер TCP/IP Java
Помогите создать приложение, в котором на сервере нужно вводить имя файла, а на клиентах должен выводится путь к этому файлу. Заранее...

Пул потоков
есть код, while(Parser::mailsCount<MAX) { boost::mutex io_mutex; boost::thread_group group; for (int i = 0; i <...

Пул потоков
Здравствуйте. Допустим, у нас есть массив из 1000 элементов и n потоков, которые должны обработать этот массив, но каждый поток должен...

7
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
29.01.2016, 23:50
zheckster, используйте ThreadPoolExecutor
1
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 24
30.01.2016, 11:08  [ТС]
Можно, пожалуйста, простой пример, как перенаправить данные в поток, и выполнять обработку в этом потоке (используя фиксированный пул потоков).
Интересует передача ида сокета в этот поток.
Или на моем примере выше как это реализовать?
Толковых примеров не нашел что-то..
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
30.01.2016, 12:44
Цитата Сообщение от zheckster Посмотреть сообщение
Можно, пожалуйста, простой пример
Пример
и ещё полно в гугле.
0
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 24
30.01.2016, 14:23  [ТС]
Непонятно что-то, как реализовывается подобное..
Так-с, смотрите. В main я создаю сам пул, верно? Например, так:
Java
1
ExecutorService executor = Executors.newFixedThreadPool(5);
Далее идет цикл while, ожидающий клиентов. При подсоединении клиента я его ставлю в очередь пула, верно ?
Делается это, как я понял, вот так:
Java
1
executor.submit();
А что указать в параметрах submit ?
Как сделать именно обработку клиента в отдельном потоке ?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
30.01.2016, 15:04
Цитата Сообщение от zheckster Посмотреть сообщение
А что указать в параметрах submit ?
почему бы вам не почитать документацию и примеры. Там все написанно.
0
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 24
30.01.2016, 17:20  [ТС]
Форум создан для помощи, вроде бы как..
Как мне направить клиента обрабатываться в поток ?
В java только начал писать что-то, поэтому разобраться трудно.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
31.01.2016, 00:20
Лучший ответ Сообщение было отмечено zheckster как решение

Решение

Советую сразу разделить код самого сервера и main. Чтобы было понятней.
Как-то так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class SampleServer {
 
    public static void main(String args[]) {
        try {
            int i = 0;
            ServerSocket server = new ServerSocket(9541);
            System.out.println("server is started");
 
            ExecutorService executor = Executors.newFixedThreadPool(5);
            while (true) {
                Socket accept = server.accept();
                Worker worker = new Worker(i, server.accept());
                executor.submit(worker);
                i++;
            }
        } catch (Exception e) {
            System.out.println("init error: " + e);
        }
    }
}
 
class Worker implements Runnable {
 
    final Socket s;
    final int num;
 
    Worker(int num, Socket s) {
        this.num = num;
        this.s = s;
        System.out.println("Client was connected");
    }
 
    @Override
    public void run() {
        try {
            InputStream is = s.getInputStream();
            OutputStream os = s.getOutputStream();
            byte buf[] = new byte[64 * 1024];
            int r = is.read(buf);
            String data = new String(buf, 0, r);
            data = "" + num + ": " + "\n" + data;
            os.write(data.getBytes());
            System.out.println(data);
            s.close();
        } catch (Exception e) {
            System.out.println("init error: " + e);
        }
    }
}
PS. Никогда не стартуйте потоки в конструкторе - плохая практика.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.01.2016, 00:20
Помогаю со студенческими работами здесь

Есть ли в C++ пул потоков
Перерыл много ссылок и не мог найти есть ли в с++ пул потоков,все источники указывают на с# ThreadPol,у меня курсовая пул потоков а...

Создать пул потоков
Добрый день. Есть код рабочий, для логирования изменений параметров/связей. Следующий код срабатывает каждый раз по событию сохранения...

Пул потоков с семафорами
Задача:написать свой пуль потоков Написал вот такой код #include <windows.h> #include "Worker.h" #include<list> ...

Цикл For и пул потоков
Здравствуйте. У меня есть метод, в котором есть цикл For. при этом мне нужно выполнять данный метод в таймере с определенной...

Неблокирующий пул потоков
Здравствуйте! Пытаюсь реализовать собственных пул потоков для тренировки. Возникают проблемы. Метод shutdown работает не так как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru