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

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

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

Author24 — интернет-сервис помощи студентам
Пытаюсь сделать консольный чат на сокетах. В методе 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2017, 21:53
Ответы с готовыми решениями:

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

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

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

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

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

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

Цитата Сообщение от savenkodenys Посмотреть сообщение
А во-вторых, как это сервер ничего не знает о клиенте?
Я тебе говорю не о сущности "клиент", а о самом классе клиент, не желательно чтобы сервер знал о нем и тем более запускал вложенный класс клиента.
0
18.09.2017, 19:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2017, 19:31
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru