Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111

Не отправляются сообщения серверу

07.10.2018, 22:43. Показов 1984. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь написать чат на сокетах и вот такая непонятность имеет место. При подключении клиента серверу отправляется условное приветствие "hi", на что сервер высылает последние 10 сообщений. Сообщения высылаются, но дальше в клиенте запускается цикл прослушивания стандартного потока ввода и отправка сообщений серверу. Вот это-то и не происходит. После вывода архива сообщений, клиент чего-то ждет, но не серверу ничего не отсылает. Без вывода первых 10 сообщений все работает. Вот код клиента:
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
public class Client {
    public static void main(String[] args) throws IOException {
        try(Socket socket = new Socket("localhost", 1234)){
            OutputStream output = socket.getOutputStream();
            InputStream input = socket.getInputStream();
            PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
            printWriter.println("hi");
            printWriter.flush();
 
            Scanner sc = new Scanner(input);
                while (sc.hasNext())
                    System.out.println(sc.nextLine());// вывод архива сообщений
                sc.close();
                printWriter.close();
 
 
            try (Scanner scanner = new Scanner(System.in)){
                String str;
                while (!socket.isOutputShutdown()){
                    str = scanner.nextLine();// считывание строк из стандартного ввода
                    printWriter.println(str);// и отправка на сервер
                    printWriter.flush();
 
                    Thread t = new Thread(() -> {
                        try(Scanner scanner1 = new Scanner(input, "UTF-8")){
                            String msg;
                            while (!socket.isInputShutdown()){
                                msg = scanner1.nextLine();// считывание сообщений с сервера
                                System.out.println(msg);
                            }
                        }
                    });
                    t.start();
                    t.setDaemon(true);
 
                    if (str.equalsIgnoreCase("bye"))
                        break;
                }
            }
 
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2018, 22:43
Ответы с готовыми решениями:

Не отправляются сообщения
Добрый вечер, у меня планшет Ampe A10, были установлены приложения вконтакте и одноклассники, все работало нормально, но потом у меня стала...

Не отправляются сообщения на почту
Добрый день, форумчане. Столкнулся сегодня с такой проблемой: На одном хостинге использую форму обратной связи, сообщения без проблем...

Не отправляются сообщения в чат
На игровом сайте по покеру есть чат. Я пишу в строке сообщение на английском, жму Ентер и оно исчезает. Другие все нормально отсылают и...

12
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
08.10.2018, 10:25
Java
1
2
3
4
5
 Scanner sc = new Scanner(input);
                while (sc.hasNext())
                    System.out.println(sc.nextLine());// вывод архива сообщений
                sc.close();
                printWriter.close();
а как он понимает что хватит читать из потока?
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
08.10.2018, 12:27  [ТС]
Цитата Сообщение от snajper_ro Посмотреть сообщение
while (sc.hasNext())
- этого недостаточно?

Добавлено через 4 минуты
то есть отправляются 10 сообщений, как они заканчиваются - переход к следующему циклу.
0
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
08.10.2018, 12:55
запустите ваш среду в режиме дэбага и посмотрите где она ждет

Добавлено через 25 секунд
а с чего вы взяли что этого достаточно?

Добавлено через 4 минуты
1)можно отправить одинадцатым сообщением, что хватит читать
2)закрыть на стороне сервере outputstream, что значит что я отправил все данные(но тут уже зависит от реализации), попробуйте 1 вариант, и второй
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
08.10.2018, 19:18  [ТС]
Да не понятно, чего она ждала... Я проходил дебагом. Просто после цикла приема 10 сообщений переходила на первую строку метода main.
Цитата Сообщение от snajper_ro Посмотреть сообщение
а с чего вы взяли что этого достаточно?
- ну я думал, что это и есть условие выхода из цикла - пока в потоке что-то есть. Ну ладно, ввожу счетчик, при значении 10 цикл прерывается, но потом стандартный поток ввода как-будто игнорируется. Программа сразу переходит к считыванию сообщений из потока сервера, но так-как сервер возвращает сообщения клиента выдается
Exception in thread "Thread-0" java.util.NoSuchElementException: No line found. Что-то ввести не получается. Но до того, как я стал выводить этот архив сообщений все работало! Что я делаю не так? Создал сканер для считывания архива, закрыл. Создал другой, для считывания из стандартного потока ввода. Вот код:
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
public class Client {
    public static void main(String[] args) throws IOException {
        try(Socket socket = new Socket("localhost", 1234)){
            OutputStream output = socket.getOutputStream();
            InputStream input = socket.getInputStream();
            PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
            printWriter.println("hi");
            printWriter.flush();
 
            int count = 0;
 
            Scanner sc = new Scanner(input);
                while (sc.hasNext()){
                    if (count==10)
                        break;
                    System.out.println(sc.nextLine());// вывод архива собщений
                    count++; }
                sc.close();
                printWriter.close();
 
            PrintWriter printWriter2 = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
 
            try (Scanner sc2= new Scanner(System.in)){
                String str;
                while (!socket.isOutputShutdown()){
                    if (sc2.hasNext()) {
                        str = sc2.nextLine();// считывание строк из стандартного ввода
                        printWriter2.println(str);// и отправка на сервер
                        printWriter2.flush();
 
                        Thread t = new Thread(() -> {
                            try (Scanner sc3 = new Scanner(input, "UTF-8")) {
                                String msg;
                                while (!socket.isInputShutdown()) {
                                    msg = sc3.nextLine();// считывание сообщений с сервера
                                    System.out.println(msg);
                                }
                            }
                        });
                        t.start();
 
                        if (str.equalsIgnoreCase("bye"))
                            break;
                    }
                }
            }
        }
    }
}
0
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
08.10.2018, 19:29
1)выложите полный код для теста, я вам за 10 секунд найду вашу проблему
1.а)запускается сервер
1.б)запускается клиент
все это в одном файле
2)я не вижу , где у вас падает
3)а кто сказал , что инпут стрим надо закрывать, если вы закроете сканер, то ваш инпут стрим(тоже закроется)
и вы уже не сможете считать ваши данные
4)учитесь сразу вылаживать ваш код в одном куске, чтобы можно было запуск и ошибка понятна, а то от вашего словоблудия не очень понятно, что и как у вас
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
08.10.2018, 19:37  [ТС]
Цитата Сообщение от snajper_ro Посмотреть сообщение
1)выложите полный код для теста
Клиент я выложил. Сервер:
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
public class Server {
 
    private static List<String> lastMsg = new ArrayList<>();
 
    private static List<Socket> socketList = new ArrayList<>();
 
    public static void main(String[] args) throws IOException {
        for (int i = 0; i<10; i++)
            addMsg(Integer.toString(i));
 
        ServerSocket socket = new ServerSocket(1234);
 
            System.out.println("Сервер стартовал");
            try {
 
                while (true) {
 
                       Socket incoming = socket.accept();
 
                       getSocketList().add(incoming);
 
                    System.out.println("Есть подключение");
                        Thread t = new Thread(new ThreadedHandler(incoming));
                        t.start();
                }
            }finally {
                socket.close();
            }
    }
 
    public static void addMsg(String msg){
        lastMsg.add(msg);
    }
 
    public static List<String> getLastMsg(){
        return lastMsg;
    }
 
    public static List<Socket> getSocketList() {
        return socketList;
    }
}
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
public class ThreadedHandler implements Runnable {
 
    private Socket incoming;
 
    public ThreadedHandler(Socket incoming){
        this.incoming = incoming;
    }
    @Override
    public void run(){
 
        try {
            InputStream in = incoming.getInputStream();
            PrintWriter printWriter;
 
                try (Scanner sc = new Scanner(in, "UTF-8")){
 
                    String msg = "";
 
                    while (incoming.isConnected()) {
 
                        if (sc.hasNext()) {
 
                            msg = sc.nextLine();
 
                            if (msg.equalsIgnoreCase("hi")){
                                printWriter = new PrintWriter(new OutputStreamWriter(incoming.getOutputStream(), "UTF-8"));
                                for(String m: Server.getLastMsg()){
                                printWriter.println(m);
                                printWriter.flush();
                                }
                            }else Server.addMsg(msg);
 
                            System.out.println(msg);
                            List<Socket> list = Server.getSocketList();
 
                            for (Socket socket : list) {
                                printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
                                printWriter.println(msg);
                                printWriter.flush();
                            }
                        }
                    }
                }
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Добавлено через 51 секунду
Время пошло)

Добавлено через 49 секунд
Шучу, конечно). Спасибо за помощь.
0
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
08.10.2018, 19:37
подумайте пока сами, а то как вы будете творить
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
08.10.2018, 19:47  [ТС]
Цитата Сообщение от snajper_ro Посмотреть сообщение
подумайте пока сами, а то как вы будете творить
- да нет, стандартный ввод считывается, но сообщения от сервера не принимаются почему-то.
0
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
08.10.2018, 20:04
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
import java.io.*;
import java.net.Socket;
import java.util.*;
 
public class Client {
    public static void main(String[] args) throws IOException {
        try (Socket socket = new Socket("localhost", 1234)) {
            OutputStream output = socket.getOutputStream();
            InputStream input = socket.getInputStream();
            PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
            printWriter.println("hi");
            printWriter.flush();
 
            int count = 0;
 
            Scanner sc = new Scanner(input);
            while (sc.hasNext()) {
                if (count == 10)
                    break;
                System.out.println(sc.nextLine());// вывод архива собщений
                count++;
            }
            System.out.println("здесь я должен догадаться о вводе:");
            try (Scanner sc2 = new Scanner(System.in)) {
                String str;
                while (!socket.isOutputShutdown()) {
                    if (sc2.hasNext()) {
                        str = sc2.nextLine();// считывание строк из стандартного ввода
                        printWriter.println(str);// и отправка на сервер
                        printWriter.flush();
 
                                String msg;
                                while (!socket.isInputShutdown()) {
                                    //тут я опять жду, чего не знаю,наверно бай
                                    msg = sc.nextLine();// считывание сообщений с сервера
                                    System.out.println(msg);
                                }
                        if (str.equalsIgnoreCase("bye"))
                            break;
                    }
                }
            }
        }
    }
}
1
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
08.10.2018, 20:15  [ТС]
snajper_ro, спасибо. То есть вы убрали создание нити считывания сообщений от сервера?

Добавлено через 1 минуту
А я уж начал поглядывать не накосячил ли я чего в серверной части...
0
 Аватар для snajper_ro
116 / 101 / 52
Регистрация: 14.09.2011
Сообщений: 696
Записей в блоге: 1
08.10.2018, 20:16
я бы советовал сравнить мой и ваш код
чтобы очень ясно разобраться, там потом вообще не надо, хотя в вашей случае может и надо, но клиент должен сам пониматЬ .когда он закончил считывание, а не вы вводить что-нибудь в консоль
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
08.10.2018, 21:44  [ТС]
Цитата Сообщение от snajper_ro Посмотреть сообщение
я бы советовал сравнить мой и ваш код
- да, да... спасибо, этим и занимаюсь.

Добавлено через 21 минуту
snajper_ro, но ваш клиент не работает, как должен. Отправляется и возвращается только первое сообщение серверу. Нужно чтобы все вводимые в консоль сообщения отправлялись и возвращались. Я увидел свою ошибку, сканер потока сервера нужно было открыть только один раз и не закрывать после считывания архива сообщений. Если я оставляю нить считывания сообщений от сервера, то после второго введенного слова возникает Exception in thread "Thread-1" java.lang.IndexOutOfBoundsException: end.

Добавлено через 45 секунд
Но это сообщение возвращается

Добавлено через 9 минут
Исключение надо полагать из-за приветственного сообщения - hi. Его бы вообще в поток вывода с сервера не отсылать. Написал
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
try (Scanner sc = new Scanner(in, "UTF-8")){
 
                    String msg;
 
                    while (incoming.isConnected()) {
 
                        if (sc.hasNext()) {
 
                            msg = sc.nextLine();
 
                            if (msg.equalsIgnoreCase("hi")){
                                printWriter = new PrintWriter(new OutputStreamWriter(incoming.getOutputStream(), "UTF-8"));
                                for(String m: Server.getLastMsg()){
                                printWriter.println(m);
                                printWriter.flush();
                                }
                            }else {
                                Server.addMsg(msg);
 
                                System.out.println(msg);
                                List<Socket> list = Server.getSocketList();
 
                                for (Socket socket : list) {
                                    printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
                                    printWriter.println(msg);
                                    printWriter.flush();
                                }
                            }
                        }
                    }
                }
То есть вывод сообщений в блок проверки входящего сообщения включил- почему-то сообщения не принимаются...

Добавлено через 52 минуты
snajper_ro, впрочем, нити в цикле - это я ерунду написал. Сейчас посмотрел примеры. Действительно считывание сообщений от сервера нужно запускать в отдельном потоке, но его нужно создавать в конструкторе клиента. Не кидайте в меня тапками, я только учусь...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.10.2018, 21:44
Помогаю со студенческими работами здесь

Не отправляются сообщения из Ajax-формы
Привет всем! Сделал ajax форму для отправки сообщений по уроку http://www.calabonga.com/Blog/ViewPost.aspx?id=85, но она ничего и никуда...

Не отправляются сообщения mail () php на hotmail
Сообщения отправляемые через mail () не доходят до hotmail. Даже в спаме нет. Проверял на mail.ru, там все работает. $from = 'тут...

Не отправляются сообщения на E-mail с формы на сайте
Здравствуйте! Скачал в интернете шаблон одностраничника (если поможет, вот название и ссылка: Meilleur HTML5 website template)....

Не отправляются почта и др. сообщения с компа Win XP SP2
Здравствуйте. Виндовс ХР сервис пак 2 Что-то произошло, но что и когда как всегда непонятно. Но теперь винда недает отправлять в...

Не отправляются сообщения с формы. Скорее всего дело в хостинге
Всем привет. Не хотят отправляться сообщения с формы. Код полостью рабочий, в этом я уверен на все 100%, потому что на другом хостинге,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru