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

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

30.03.2014, 19:35. Просмотров 3961. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2014, 19:35
Ответы с готовыми решениями:

Чат на сокетах
Начал работу с сетью, пробую написать небольшой чат на tcp сокетах, на стороне сервера всё...

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

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

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

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

8
Freedomen
59 / 59 / 19
Регистрация: 06.09.2013
Сообщений: 236
Записей в блоге: 1
30.03.2014, 19:43 2
Создайте HashMap, добавьте всех клиентов туда и сделайте метод, который будет каждому клиенту из коллекции отправлять сообщение/пакет.
0
Kateryna03
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 40
30.03.2014, 20:24  [ТС] 3
А не подскажите, как написать этот метод отправки сообщения каждому клиенту?
0
Freedomen
59 / 59 / 19
Регистрация: 06.09.2013
Сообщений: 236
Записей в блоге: 1
30.03.2014, 21:04 4
Создайте инстанс нужного вам объекта/коллекции и уже там отправьте пакет.
0
30.03.2014, 21:04
Kateryna03
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
Freedomen
59 / 59 / 19
Регистрация: 06.09.2013
Сообщений: 236
Записей в блоге: 1
30.03.2014, 21:45 6
Очень странный стиль программирования - класс в классе. Сделайте отдельные классы, реализуйте в каждом из них логику и используйте ссылочные переменные соответствующих типов!

И научитесь пользоваться Java API. Изучите вот этот материал, все встанет на свои места.
0
tankomaz
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
440 / 439 / 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
Freedomen
59 / 59 / 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
tankomaz
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
440 / 439 / 100
Регистрация: 14.10.2012
Сообщений: 1,147
Записей в блоге: 9
30.03.2014, 22:23 9
Freedomen, когда видишь "Очень странный стиль программирования", то я вас прекрасно понимаю
1
30.03.2014, 22:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 22:23

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

Чат на сокетах
Я создаю чат на С ++, только такой в котором 1 сервер который как и клиент также может отправлять и...

Чат на сокетах
Здравствуйте. Решил написать не большой чат на JAVA. Опыта работы в JAVA немного. Собственно решил...


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

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

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