Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
12 / 12 / 10
Регистрация: 04.06.2017
Сообщений: 99

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

16.09.2017, 21:53. Показов 780. Ответов 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
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 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
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
ПЛИС
zxcha1ka_ 27.01.2026
AHDL Разработать программы для синтеза следующих устройств: 1. Параллельного регистра 4-х разрядного с синхронной загрузкой и асинхронным сбросом (обнулением); Пoмoгитe пoжaлyйстa
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru