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

Клиент-сервер со множеством клиентов java

06.08.2013, 20:56. Показов 7913. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Писал программу клиент-сервер со множественным подключением клиентов, но столкнулся с проблемой: не могу с одного сервера отправить сообщение всем клиентам. Т.е. программа работает по принципу эхо-сервер для всех подключенных клиентов.
Собственно вопрос: как можно реализовать ответ сразу всем клиентам. Т.е. Вася пишет "привет", а у Пети и Вани отображается "Вася: привет"(clientName+": "+message).
Вот код того, что на данный момент есть:
Client:
Кликните здесь для просмотра всего текста
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
54
55
56
57
58
59
60
61
package simplechat;
 
import java.net.*;
import java.io.*;
import java.util.*;
 
/**
 *
 * @author Sergey
 */
public class Client {
 
    private String userName;
    
    public Client(){
        this.userName = "";
    }
 
    public void setName(String name){
        this.userName = name;
    }
    public String getName(){
        return userName;
    }
 
    public static void main(String[] args) throws IOException{
        System.out.println("Welcome to Client!");
        String fuser, fserver;
 
        Socket fromserver = new Socket("localhost", 4444);
 
        Scanner sc = new Scanner(System.in);
        BufferedReader in  = new BufferedReader
                (new InputStreamReader(fromserver.getInputStream()));
        PrintWriter    out = new PrintWriter
                (fromserver.getOutputStream(),true);
         BufferedReader inu  = new BufferedReader
                (new InputStreamReader(System.in));
         
        System.out.println("Set name: ");
        Client cl = new Client();
        if(sc.hasNext()){
           cl.setName(sc.next());
        }
        System.out.println("Name confirmed, "+cl.getName());
        out.println(cl.getName());
        
        while((fuser = inu.readLine())!= null){
            out.println(fuser);
            fserver = in.readLine();
            System.out.println(fserver);
            if(fuser.equalsIgnoreCase("exit chat")) break;
            if(fuser.equalsIgnoreCase("close chat")) break;
        }
 
        out.close();
        in.close();
        inu.close();
        fromserver.close();
    }     
}


Server:
Кликните здесь для просмотра всего текста
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package simplechat;
 
import java.io.*;
import java.net.*;
import java.util.*;
 
/**
 *
 * @author Sergey
 */
public class Server implements Runnable{
    
    Socket connection;
    String input;
    
    public Server(Socket socket){
        this.connection = socket;
        
    }
    
    public static void main(String[] args) throws IOException{
        System.out.println("Welcome to Server!");
 
        ServerSocket servers = null;
        
        try{
            servers = new ServerSocket(4444);
        }catch(IOException e){
            System.out.println("Can't connect to port");
            System.exit(-1);
        }
        while(true){
            try{
                System.out.println("Waiting for a client...");
                Socket connection = servers.accept();
                Runnable runnable = new Server(connection);
                Thread thread = new Thread(runnable);
                thread.start();
                System.out.println("Client connected");
            }catch(IOException e){
                System.out.println("");
                System.exit(-1);
            }
        }   
    }
 
    @Override
    public void run() {
        String name="";
        try {
            BufferedReader in = new BufferedReader(new 
                        InputStreamReader(connection.getInputStream()));
            PrintWriter out = new PrintWriter(connection.getOutputStream(), true);
            if((input = in.readLine())!=null){ 
                name = input;
            }
            System.out.println("Waiting for messages...");
            while(true){
                if((input = in.readLine())!=null){
                    out.println(name+": "+input);
                    System.out.println("S: "+input);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.08.2013, 20:56
Ответы с готовыми решениями:

DataSnap Сервер-Клиент подключение клиентов к БД
Добрый день! Необходимо чтобы клиенты после подключения к серверу по локальной сети получали некоторые данные из БД. И по завершению работы...

Клиент-Сервер с очень большим количеством клиентов
Суть такова : видел очень много статей и исходных колов по реализации клиент-серверных приложений, но во всех одна проблема - для каждого...

Клиент-сервер. Как расставить клиентов по приоритетам?
есть Class server и много клиентов, функция типа void посылает string message. Как раставить клиентов по приоритетам? Заранее благодарен.

3
5 / 5 / 2
Регистрация: 04.04.2013
Сообщений: 44
04.09.2013, 03:27
Тебе на сервере нужно хранить массив подключенных клиентов, причем каждый из которых должен жить в отдельном потоке. и при поступлении на сервер нового сообщения проходить по массиву и каждому из клиентов отсылать это сообщение на его соккет.
Пример сервера который писал давненько для учебных нужд:

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
 
public class ServerLocalChat{
 
    
    static  Socket clientSocket = null;
    static  ServerSocket serverSocket = null;
 
    static List<clientThread> t = new ArrayList();
    
    public static void main(String args[]) {
 
    int port_number=3310;
    
        try {
        serverSocket = new ServerSocket(port_number);
        }
        catch (IOException e)
        {System.out.println(e);}
 
    while(true){
        try {
        clientSocket = serverSocket.accept();
                clientThread client = new clientThread(clientSocket,t);
                t.add(client);
                client.start();
        }
        catch (IOException e) {
        System.out.println(e);}
    }
    }
} 
class clientThread extends Thread{
    
    DataInputStream is = null;
    PrintStream os = null;
    Socket clientSocket = null;       
    List<clientThread> t; 
    
    String name;
    
    public clientThread(Socket clientSocket, List<clientThread> t){
    this.clientSocket=clientSocket;
        this.t=t;
    }
    
    public void run() 
    {
    String line;
 
    try{
        is = new DataInputStream(clientSocket.getInputStream());
        os = new PrintStream(clientSocket.getOutputStream());
        os.println("Enter your name: ");
        name = is.readLine();
        os.println("Hello "+name+" to our chat room.\nTo leave enter /quit in a new line"); 
            for (clientThread client : t)
                client.os.println("*** A new user "+name+" entered the chat room !!! ***" );
        while (true) {
        line = is.readLine();
                if(line.startsWith("/quit")) 
                    break;
                if(line.startsWith("<")) {
                    String tempName = line.substring(1, line.lastIndexOf(">"));
                    System.out.println(tempName);
                    boolean flag=true;
                    for (clientThread ct : t) {
                        if (ct!=null) {
                            if (ct.name.equals(tempName)) {
                                ct.os.println(line);
                                flag=false;
                            } 
                        } else {
                            break;
                        }
                    }
                    if (flag)
                        this.os.println("User " + tempName + " is not online");
                } else {
                    for (clientThread client : t)
                        client.os.println("<"+name+"> "+line); 
                }
        }
 
        for (clientThread client : t)
                if (client!=null && client!=this)  
            client.os.println("*** The user "+name+" is leaving the chat room !!! ***" );
        os.println("*** Bye "+name+" ***"); 
            
            for (clientThread client : t)
                if (client==this) client=null;
       
        is.close();
        os.close();
        clientSocket.close();
    }
    catch(IOException e){};
    }
}
Лишние вещи уж сам удали
1
KeM6Pug}I{a
49 / 49 / 1
Регистрация: 23.08.2013
Сообщений: 202
14.09.2013, 15:08
На каждый клиент на отдельном потоке это просто ужас.. а если их будет 1000? Советую воспользоватся NIO - Selector
0
2 / 2 / 0
Регистрация: 26.09.2013
Сообщений: 13
02.10.2013, 12:16
Цитата Сообщение от MbICJIuTeJIb_u3 Посмотреть сообщение
На каждый клиент на отдельном потоке это просто ужас.. а если их будет 1000? Советую воспользоватся NIO - Selector
Очень хороший совет!
Как раз столкнулся с подобной проблемой. На 37-м потоке сервер крашится... Очень большая "куча" размером более 1 Гб. Поначалу решил организовать пул потоков, но потом все же вышел на Selector. В моем случае все клиенты будут работать под Android, а там NIO с самого начала присутствует. Есть идеи как организовать карту клиентов?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.10.2013, 12:16
Помогаю со студенческими работами здесь

Клиент-сервер: отображение списка онлайн-клиентов
Привет всем!! Подскажите пожалуйста, делаю клиен-серверное приложение как сделать чтоб на сервере и на клиенте добавлялись в ListBox...

Клиент-сервер udp: реализовать подключение множества клиентов
доброго времени суток. как реализовать подключение множества клиентов? понимаю, что необходимо организовать структуру сокетов, которые...

Клиент-Сервер: отобразить на форме всех подключенных клиентов
Короче задача такая... Нужно сделать клиент-серверное приложение. На сервер должно быть консольное приложение которое будет получать всех...

Java сервер Flash клиент java.io.StreamCorruptedException: invalid stream header
Есть класс сериализованный на стороне java (сервер) и actionscript(клиент). При попытке передачи объекта от клиента к серверу вылетает...

Сервер c использованием Java nio для множества клиентов
Все привет. Недавно познакомился с java nio, и возник такой вопрос при создании сервера для клиента, взял сервер из примера import...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru