powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Простой консольной чат на сокетах
15 сообщений из 15, страница 1 из 1
Простой консольной чат на сокетах
    #37891747
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
В целях самообразования написал консольной чат на сокетах, клиенты могут конектится к серверу и переписыватся, но есть пара нюансов.
1) Если пишеш первое сообщение, то оно никому не приходит. Дальше рассылка сообщений идет нормально.
2) Из кирилицой проблемы, сообщения отправляет из задержкой, и в виде иероглифов.

Сам сервер:
Здесь происходит создание потоков для каждого клиента
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class Chat{
    public static void main(String[] args) {
       System.out.println("Program starting...");
        try {
            ServerSocket ss = new ServerSocket(9222);
            System.out.println("Server starting...");
            while(true){
                Socket s = ss.accept(); // ожидание новых клиентов
                SocketThread socketThread = new SocketThread(s);
                Thread t = new Thread(socketThread);
                t.start(); // запуск нового потока для каждого нового клиента
            }
        } catch (IOException ex) {
            Logger.getLogger(Chat.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
 }


Клас которой сохраняет в listSocket сылки на все сокеты, которые есть на даный момент.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class ListSocket {

    private static ArrayList<Socket> listSocket = new ArrayList<Socket>();

    public synchronized static ArrayList<Socket> getListSocket() {
        return ListSocket.listSocket;
    }

    public synchronized static void addSocketToList(Socket s) {
        ListSocket.listSocket.add(s);
    }

    public synchronized static void removeSocketWithList(Socket s) {
        ListSocket.listSocket.remove(s);
    }
}



Реалезация действий сокета
Код: 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.
public class SocketThread implements Runnable {

    private Socket s = null;
    private Scanner in = null;
    private PrintWriter out = null;
    private boolean exit = true;
    private String inMessage = null;
    private String outMessage = null;
    private ArrayList<Socket> listSocket = null;

    public SocketThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() { 
        try {
            System.out.println("User connect...");
            ListSocket.addSocketToList(s); //  добавление текущого сокета с глобальной список сокетов
            in = new Scanner(s.getInputStream());
            while (exit) {
                inMessage = in.nextLine();
                listSocket = ListSocket.getListSocket();
                for (Socket socket : listSocket) { // отсылка сообщения всем сокетам\клиентам
                    if (!socket.equals(s)) {
                        out = new PrintWriter(socket.getOutputStream());
                        out.println(inMessage);
                        out.flush();
                    }
                }
                if (inMessage.trim().equals("exit")) {
                    exit = false;
                }
            }
            ListSocket.removeSocketWithList(s); // если поток завершается то сокет клиента удаляется из списка сокетов 
            System.out.println("User disconnect...");
        } catch (IOException ex) {
            try {
                s.close();
            } catch (IOException ex1) {
                Logger.getLogger(SocketThread.class.getName()).log(Level.SEVERE, null, ex1);
            }
            Logger.getLogger(SocketThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}



---------------------------------------------------------------------------------------------------

Клиент:

Здесь идет коннект к серверу и создается поток на прослушывание и отправление даных.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class ChatClient {

    public static void main(String[] args) {
        try {
            System.out.println("Client starting...");
            Socket s = new Socket("192.168.0.17",9222);
            System.out.println("Connect to server...");
            Thread threadIn = new Thread(new SocketInputThread(s));// создание отдельного потока на считывание даных от сервера
            Thread threadOut = new Thread(new SocketOutputThread(s));// создание отдельного потока на ввод даных из клавиатуры
            threadIn.start();
            threadOut.start();
        } catch (UnknownHostException ex) {
            Logger.getLogger(ChatClient.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ChatClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}



Поток, который считывает входные даные.
Код: 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.
public class SocketInputThread implements Runnable {

    private Socket s = null;
    private Scanner in = null;
    private PrintWriter out = null;
    private boolean exit = true;
    private String inMessage = null;
    private String outMessage = null;

    public SocketInputThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        try {
            in = new Scanner(s.getInputStream());
            while(true){
                if(in.hasNext()){
                 inMessage = in.nextLine();
                 System.out.println(inMessage);
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(SocketInputThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}



Поток читает ввод из клавиатуры и отсылает на сервер.
Код: 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.
public class SocketOutputThread implements Runnable {

    private Socket s = null;
    private Scanner in = null;
    private PrintWriter out = null;
    private boolean exit = true;
    private String inMessage = null;
    private String outMessage = null;

    public SocketOutputThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        try {
            out = new PrintWriter(s.getOutputStream());
            BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                outMessage = buffer.readLine();
                out.println(outMessage);
                out.flush();
            }
        } catch (IOException ex) {
            Logger.getLogger(SocketOutputThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37891752
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сами коды
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37891759
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор Из кирилицой проблемы. Однозначно
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37892233
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis11111Сами коды

Машинные? :)
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37892312
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большой Синий Китdenis11111Сами коды

Машинные? :)
Типа такие)
1001100
1001111
1001100
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37892347
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оффтоп:
Сделайте чат на мультикаст-юдп сокетах. Это когда любой пишет и любой, подконнектишився, читает.
ПС. Пара строк для клиента и десяток для сервера.
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37892354
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если судить по коду, то клиенты у вас вообще общаются в обход сервера.
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37892365
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaЕсли судить по коду, то клиенты у вас вообще общаются в обход сервера.
так. извиняюсь. перепутал.
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37892392
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил.
На одной машине все замечательно работает.
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37892425
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schwaПроверил.
На одной машине все замечательно работает.
А в меня первое(не важно с какого клиента) сообщение не доходит.
И руские буквы не отображает.
Например пишет клиент 1: "Привет"
У клиент 2 пусто... тогда клиент 2 тоже пишет "Привет, я клиент 2"
и только тогда ему приходит от клиент 1 типа такое "??????".
Из англ. буквами такого нету.
Думал фича консоли, а нет, System.out.println("Привет"), выводит нормально
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37892493
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так все работает, но с кодировкой проблемы есть все равно (и лучше на это забить).
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37893748
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schwaТак все работает, но с кодировкой проблемы есть все равно (и лучше на это забить).
А почему лучше забить?
Мне кажется это важно...

Оказывается что руские буквы приходят из консоли уже в плохой кодировке, зделал так :
Код: java
1.
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in,"windows-1251"));


Не помогло, если зделать
Код: java
1.
2.
outMessage = buffer.readLine();
System.out.println("This is out:" + outMessage);


то все равно возвращает квадратики.
Я здалал маленикий пример:
Код: java
1.
2.
3.
4.
5.
6.
public static void main(String args[]) throws MalformedURLException, IOException {
       BufferedReader bfReader = new BufferedReader(new InputStreamReader(System.in,"windows-1251"));
       System.out.println("Input string:");
       String str = bfReader.readLine();
       System.out.println("You enter:" + str);
    }


Здесь из рускими буквами все в порядке. Вобщем я сошол с ума. Два одинаковых кода работают по разному.
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37893763
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis11111schwaТак все работает, но с кодировкой проблемы есть все равно (и лучше на это забить).
А почему лучше забить?
Мне кажется это важно...
Исходная кодировка неизвестна.
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37893766
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Текстовая консоль операционки и аналогичная в IDE могут работать в разных кодировках.
...
Рейтинг: 0 / 0
Простой консольной чат на сокетах
    #37893785
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczТекстовая консоль операционки и аналогичная в IDE могут работать в разных кодировках.
Так я два варианта запускал через NetBeans.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Простой консольной чат на сокетах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]