Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/26: Рейтинг темы: голосов - 26, средняя оценка - 4.58
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 40
1

Консольный чат Клиенты-Сервер на сокетах

30.03.2014, 19:35. Просмотров 4761. Ответов 8
Метки нет (Все метки)

При отправки сообщения клиентом, оно приходит только серверу, а как сделать, чтобы оно приходило еще всем клиентам?

Сервер:
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
import java.net.*;
import java.io.*;
 
class Server1 {
    private static int port = 3333; 
 
    public static void main (String[] args) throws IOException {
 
        class ClientConn implements Runnable {
            private Socket client;
 
            ClientConn(Socket client) {
                this.client = client;
            }
 
            public void run() {
                BufferedReader in = null;
                PrintWriter out = null;
        
                try {
                    in = new BufferedReader(new InputStreamReader(
                                client.getInputStream()));
                    out = new PrintWriter(client.getOutputStream(), true);
                } catch (IOException e) {
                    System.err.println(e);
                    return;
                }
 
                String msg;
                try {
                    while ((msg = in.readLine()) != null) {
                        System.out.println("Client says: " + msg);
                        out.println("OK");
                    }
                } catch (IOException e) {
                    System.err.println(e);
                }
            }
        }
 
        ServerSocket server = null;
        try {
            server = new ServerSocket(port);
        } catch (IOException e) {
            System.err.println("Could not listen on port: " + port);
            System.err.println(e);
            System.exit(1);
        }
 
        Socket client = null;
        while(true) {
            try {
                client = server.accept();
            } catch (IOException e) {
                System.err.println("Accept failed.");
                System.err.println(e);
                System.exit(1);
            }
            Thread t = new Thread(new ClientConn(client));
            t.start();
        }
    }
}
Клиент:
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
import java.net.*;
import java.io.*;
 
class Client1 {
    private static int port = 3333; 
    private static String host = "localhost";
 
    public static void main (String[] args) throws IOException {
 
        Socket server = null;
 
        try {
            server = new Socket(host, port);
        } catch (UnknownHostException e) {
            System.err.println(e);
            System.exit(1);
        }
 
        PrintWriter out = new PrintWriter(server.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(
                    server.getInputStream()));
        BufferedReader stdIn = new BufferedReader(
                new InputStreamReader(System.in));
 
        String msg;
 
        while ((msg = stdIn.readLine()) != null) {
            out.println(msg);
            System.out.println(in.readLine());
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2014, 19:35
Ответы с готовыми решениями:

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

Чат клиент-сервер на сокетах
и все таки появилась еще одна проблема раньше все сообщения от клиентов просто оставались на...

Консольный чат. Почему сервер не пересылает сообщения клиентам?
пожалуйста помогите понять почему не работает мой консольный чат! сервер using System; using...

Связь клиенты-сервер-клиенты (Animate CC)
Сделал небольшое приложение для Андроид в Animate CC. Нужно, чтобы ВСЕ пользователи приложения...

8
60 / 60 / 19
Регистрация: 06.09.2013
Сообщений: 236
Записей в блоге: 1
30.03.2014, 19:43 2
Создайте HashMap, добавьте всех клиентов туда и сделайте метод, который будет каждому клиенту из коллекции отправлять сообщение/пакет.
0
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 40
30.03.2014, 20:24  [ТС] 3
А не подскажите, как написать этот метод отправки сообщения каждому клиенту?
0
60 / 60 / 19
Регистрация: 06.09.2013
Сообщений: 236
Записей в блоге: 1
30.03.2014, 21:04 4
Создайте инстанс нужного вам объекта/коллекции и уже там отправьте пакет.
0
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 40
30.03.2014, 21:38  [ТС] 5
Я вот так сделала, но при заполнении ХэшМап, NullPointerException появляется.

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
import java.net.*;
import java.util.Map;
import java.io.*;
 
class Server1 {
    private static int port = 3333; 
    private static Map<Integer, Socket> list;
    private static String msg;
    private static int key = 0;
    
    public static void main (String[] args) throws IOException {
 
        class ClientConn implements Runnable {
            private Socket client;
            
            ClientConn(Socket client) {
                this.client = client;
            }
 
            public void run() {
                BufferedReader in = null;
                PrintWriter out = null;
                try {
                    in = new BufferedReader(new InputStreamReader(
                                client.getInputStream()));
                    out = new PrintWriter(client.getOutputStream(), true);
                } catch (IOException e) {
                    System.err.println(e);
                    return;
                }
 
                //String msg;
                try {
                    while ((msg = in.readLine()) != null) {
                        System.out.println("Client says: " + msg);
                        out.println("OK");
                    }
                } catch (IOException e) {
                    System.err.println(e);
                }
            }
        }
 
        ServerSocket server = null;
        try {
            server = new ServerSocket(port);
        } catch (IOException e) {
            System.err.println("Could not listen on port: " + port);
            System.err.println(e);
            System.exit(1);
        }
 
        Socket client = null;
        while(true) {
            try {
                client = server.accept();
                
                list.put(key, client);
                key++;
                
            } catch (IOException e) {
                System.err.println("Accept failed.");
                System.err.println(e);
                System.exit(1);
            }
            Thread t = new Thread(new ClientConn(client));
            t.start();
        }
    }
    public void sendToAll(){
        for(Socket value : list.values())
        {
            PrintWriter pw;
            try {
                pw = new PrintWriter(value.getOutputStream(), true);
                pw.println(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
0
60 / 60 / 19
Регистрация: 06.09.2013
Сообщений: 236
Записей в блоге: 1
30.03.2014, 21:45 6
Очень странный стиль программирования - класс в классе. Сделайте отдельные классы, реализуйте в каждом из них логику и используйте ссылочные переменные соответствующих типов!

И научитесь пользоваться Java API. Изучите вот этот материал, все встанет на свои места.
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
441 / 440 / 100
Регистрация: 14.10.2012
Сообщений: 1,147
Записей в блоге: 9
30.03.2014, 22:13 7
Kateryna03,
может вместо private static Map<Integer, Socket> list;
напишите private static Map<Integer, Socket> list = new HashMap<>();

гарантию даю всё изменится в лучшую сторону
0
60 / 60 / 19
Регистрация: 06.09.2013
Сообщений: 236
Записей в блоге: 1
30.03.2014, 22:16 8
Цитата Сообщение от tankomaz Посмотреть сообщение
Kateryna03,
может вместо private static Map<Integer, Socket> list;
напишите private static Map<Integer, Socket> list = new HashMap<>();
гарантию даю всё изменится в лучшую сторону
Мне почему-то показалось, что она в конструкторе объект создала и привязала к ссылке.
Мне следовало быть внимательней, а то еще чего привидится...
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
441 / 440 / 100
Регистрация: 14.10.2012
Сообщений: 1,147
Записей в блоге: 9
30.03.2014, 22:23 9
Freedomen, когда видишь "Очень странный стиль программирования", то я вас прекрасно понимаю
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2014, 22:23

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Чат на сокетах
Есть сервер и клиент когда отправляешь сообщение с первого клиента втором то сообщения не...

Чат на сокетах
Здравствуйте, хочу сделать чат на PHP с использованием сокетов. С самими сокетами я познакомился,...

Чат на сокетах
Здравствуйте, форумчане. Сейчас занялся написанием чата на сокетах. Всё вроде бы хорошо, но уперся...

Чат на сокетах
Здрасьте. Знаю, что тема до невозможности бородатая, но возникла необходимость создания программы...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.