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

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

06.08.2013, 20:56. Показов 7922. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru