12 / 12 / 10
Регистрация: 04.06.2017
Сообщений: 99

Не считывает данные с входного потока

16.09.2017, 21:53. Показов 815. Ответов 3

Студворк — интернет-сервис помощи студентам
Пытаюсь сделать консольный чат на сокетах. В методе run() в классе MessageHandler (внутренний класс класса Client) поток блокируется при попытке чтения из входного потока сокета: message = reader.readLine();. Но ведь данные я туда записываю: writer.println(message);, writer.flush();
Main.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main;
 
import classes.client.Client;
import classes.server.Server;
 
public class Main {
 
    public static void main(String[] args) {
        Thread acceptingConnection = new Thread(new Server().new AcceptingConnection());
        acceptingConnection.setName("AcceptingConnectionThread");
        acceptingConnection.start();
        Client.connect();
    }
 
}
Client.java
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
public class Client {
 
    private final Socket clientSocket;
    private final String clientName;
    private InputStream  clientInput;
    private OutputStream clientOutput;
 
    public Client(Socket clientSocket, String clientName) {
        this.clientSocket = clientSocket;
        this.clientName   = clientName;
        try {
            clientInput  = this.clientSocket.getInputStream();
            clientOutput = this.clientSocket.getOutputStream();
        } catch (IOException ex) {
            clientInput  = null;
            clientOutput = null;
            ex.printStackTrace();
        }
    }
 
    public Socket getClientSocket() {
        return this.clientSocket;
    }
 
    public String getClientName() {
        return this.clientName;
    }
 
    public static void connect() {
        try {
            Socket socket = new Socket(InetAddress.getLocalHost(), Server.port);
        } catch (UnknownHostException ex) {
            ex.printStackTrace();
        } catch(IOException ex) {
            ex.printStackTrace();
        }
    }
 
    public class MessageHandler implements Runnable {
        @Override
        public void run() {
            String message;
            try(Scanner scanner = new Scanner(System.in);
                BufferedReader reader = new BufferedReader(new InputStreamReader(clientInput));
                PrintWriter writer = new PrintWriter(clientOutput)) {
 
                while(true) {
                    System.out.print("Введите сообщение: ");
                    message = scanner.nextLine();
                    if(!message.isEmpty()) {
                        writer.println(message);
                        writer.flush();
                    }
 
                    message = reader.readLine();   // Вот тут где-то подвисает!!!
                    if(message != null && !message.isEmpty())
                        System.out.println("Получено сообщение: " + message);
                }
 
            } catch(IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}
Server.java
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
package classes.server;
 
import java.util.*;
import java.io.*;
import java.net.*;
import classes.client.Client;
import java.util.logging.Level;
import java.util.logging.Logger;
 
public class Server {
 
    public final static int port = 5555;
    private List<Client> clientList;
    private ServerSocket serverSocket;
 
    public Server() {
        clientList = new ArrayList<>();
        try {
            serverSocket = new ServerSocket(port);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
 
    public class AcceptingConnection implements Runnable {
        @Override
        public void run() {
            try {
                while(true) {
                    Socket clientSocket = serverSocket.accept();
 
                    System.out.print("Введните свой ник: ");
                    Scanner scanner = new Scanner(System.in);
                    String clientName = scanner.nextLine();
                    Client client = new Client(clientSocket, clientName);
                    clientList.add(client);
 
                    System.out.println("Вход выполнен! Client: ");
                    System.out.println("\tName: " + clientName);
                    System.out.println("\tInetAdress: " + clientSocket.getInetAddress());
                    System.out.println("Количество подключенных клиентов: " + clientList.size());
 
                    Thread messageHandle = new Thread(client.new MessageHandler());
                    messageHandle.start();
 
//                    Thread senderThread = new Thread(client.new Sender());
//                    senderThread.setName("SenderThread");
//                    senderThread.start();
//
//                    Thread receiverThread = new Thread(client.new Receiver());
//                    receiverThread.setName("ReceiverThread");
//                    receiverThread.start();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.09.2017, 21:53
Ответы с готовыми решениями:

Java & Flash.Сервек, который считывает из входного потока информацию и потом обрабатывает как XML
Вот написал небольшой сервек который считывает из входного потока информацию и потом обрабатывает как XML. Если посылать инфу через telnet...

Как правильно считать данные из стандартного входного потока в С++?
Как правильно считать данные из стандартного входного потока в С++? Из стандартного входного потока в C++ вводится: целое число, точка,...

Слова входного потока
Вывести самые длинные слова входного потока! если во вх потоке самое длинное слово одно,то программа должна вывести одно слово,а если...

3
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,695
Записей в блоге: 29
18.09.2017, 18:17
1) ну ты посмотри простые сокетные чаты как делают, хоть у того же Хорстманна
2) у тебя охрененная связанность классов, ибо сервер знает о классе клиент и его вложенном классе и даже(!) запускает его на выполнение. Так не делают.
3) класс мессаджхендлер излишний, все надо в клиенте делать включая и пуск потока считывания. Сервер ничего не знает о клиенте, тот о сервере
0
12 / 12 / 10
Регистрация: 04.06.2017
Сообщений: 99
18.09.2017, 18:51  [ТС]
Welemir1, ну во-первых можно было просто помочь исправить ошибку, а не философствовать "как нужно делать". А во-вторых, как это сервер ничего не знает о клиенте? А кто будет хранить логин, пароль и ник клиента? Кто будет определять какому клиенту отправить сообщение. Кто будет хранить всех клиентов на сервере и, если есть, группы?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,695
Записей в блоге: 29
18.09.2017, 19:31
ого, сколько требований, вообще то я сразу тебе показал простое решение -снести велосипед и посмотреть у Хорстманна простейший вариант.
Два вложенных класса, задействованных непонятно зачем и запускающиеся не своим внешним классом? Где видно, что сервер что-то шлет клиенту? Что клиент должен прочесть то, там где у тебя "подвисает"? Такой код и читать сложно -много пересечений: клиент знает о сервере, тот о клиенте, притом клиент не умеет работать со своим вложенным классом, но с ним работает сервер, а сервер не может работать со своим вложенным классом, его вообще из метода мейн запускают вручную.

Цитата Сообщение от savenkodenys Посмотреть сообщение
философствовать "как нужно делать"
Это не философия, это правила ООП - как можно меньше связности в классах, иначе изменение одного ведет за собой изменение всех остальных. Хочешь философии -читай Эккеля.

Цитата Сообщение от savenkodenys Посмотреть сообщение
А во-вторых, как это сервер ничего не знает о клиенте?
Я тебе говорю не о сущности "клиент", а о самом классе клиент, не желательно чтобы сервер знал о нем и тем более запускал вложенный класс клиента.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2017, 19:31
Помогаю со студенческими работами здесь

Очистка входного потока
Здравствуйте уважаемые! Пишу игрушку на C#, возникла проблема: в одном месте (в меню выбора уровней) нужно отобразить уровень,...

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

Получение информации из входного потока
Привет участвую в олимпиаде, нужно взять информацию из потока: входные данные 5 tourist reposted Polycarp Petr reposted...

Прочитать все из входного потока
Начал учиться программировать на c#, решая задачки на сайте олимпиадного программирования. Сразу же столкнулся с проблемой: как получить...

Проверка входного потока на ошибки
Ребяты подскажите плз )))) сам не как не разберусь можно ли использовать failbit badbit goodbit и eofbit для проверки потока вот в...


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

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

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru