Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка данных сеть. TCP-сокеты. 
:(
    Опции темы
val
  Дата 22.9.2005, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: нет
Всего: 7



Привет, всем!

Имеется такая проблема. Код ниже, написан для отправки единичного сообщения, работает не всегда правильно. А именно, он иногда не отправляет сообщение:
Код

Socket socket = new Socket(targetAddress, targetPort);
OutputStream outputStream = socket.getOutputStream();
outputStream.write(message.getBytes());
socket.close();


Вот этот код работает правильно. Отличается он предыдущего тем, что добавляется задержка в 100 миллисекунд перед тем, как закрывать сокет.
Код

Socket socket = new Socket(targetAddress, this.serverPort);
OutputStream outputStream = socket.getOutputStream();
outputStream.write(message.getBytes());
waitForSend(100); // Добавил эту строчку и работает верно.
socket.close();


Я понимаю, что второй код - это решение проблемы, но нахожу это решение не приемлемым, так ждать надо неизвестно сколько и возможны ситуации, что этого времени просто не хватит.

Посоветуйте, как это делать правильно...



--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
COVD
Дата 22.9.2005, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



может вам вместо wait..() поставить outputStream.flash() и outputStream.close() ?

PM MAIL   Вверх
val
Дата 23.9.2005, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: нет
Всего: 7



Цитата
может вам вместо wait..() поставить outputStream.flash() и outputStream.close() ?


Пробовал, не помагает...



--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
Mayk
Дата 23.9.2005, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: нет
Всего: 134



Попробуй socket.shutdownOutput()
Добавлено @ 09:26
http://forum.vingrad.ru/index.php?showtopi...&st=0&unread=&# вот тут обсуждалось


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
val
Дата 26.9.2005, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: нет
Всего: 7



Посмотрел, перепробовал практически любые варинты, проблема осталась на месте: и это логичнго socket.shutdownOutput() просто закрывает исходящий поток, не дожидаясь его отправки. Не понятно... smile Вопрос остался актуальным - как дождаться того момента, что все данные уже отправлены и можно закрывать исходящий поток (сокет)?!


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
Dancer
Дата 26.9.2005, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: нет
Всего: 37



мдя, ситуаця странная. в принципе должно вот такое помочь думаю. попробуй.
Код


try {
    Socket socket = new Socket(targetAddress, this.serverPort);
    OutputStream outputStream = socket.getOutputStream();
    InputStream is = socket.getInputStream();

    outputStream.write(message.getBytes());

    while(is.avaliable() == 0) {
        System.out.println("Avaliable read 0 bytes. Wait 100 ms");
        waitForSend(100); 
    }

    outputStream.close();
    is.close();
    socket.close();
} catch(Exception e) {
    e.printStackTrace();
}




--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
val
Дата 26.9.2005, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: нет
Всего: 7



Цитата
is.avaliable() == 0
всегда будет возвращать 0, ведь мне ничего не приходит! Не, так работать не будет. Я проверил.

Это сообщение отредактировал(а) val - 26.9.2005, 11:31


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
COVD
Дата 26.9.2005, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Какая-то странная проблема. Как вы определяете, что сокет ничего не отправляет? Согласно протоколу TCP/IP сокет может делать несколько попыток отправить данные, пока не получит подтверждения приемной стороны, что все данные получены.
PM MAIL   Вверх
val
Дата 26.9.2005, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: нет
Всего: 7



Цитата
Как вы определяете, что сокет ничего не отправляет?


Принимающая сторона не получает.


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
02077461
Дата 26.9.2005, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



Код

    try{
            s = new Socket(address,2527);
            ps = new PrintStream(s.getOutputStream());
            ps.println(mes);
            ps.flush();
            ps.close();
            s.close();
        } catch (IOException e){
            System.err.println("Error: " + e);
        }
    }

У меня работало..
Добавлено @ 16:16
Код

        try{
            server = new ServerSocket(2527);
        } catch (IOException e){
            System.err.println("ServerSocket: " + e);
        }
        while (true){
            try{
                System.out.println("Server get started");
                soc = server.accept();
                PrintStream ps = new PrintStream(soc.getOutputStream());
                DataInputStream dis = new DataInputStream(soc.getInputStream());
                msg = dis.readLine();

                    System.out.println("Client says: '" + msg + "'");
                    ps.println("Sending back: '" + msg + "'");
                    ps.flush();
                    soc.close();

            } catch (IOException e){
                System.err.println("ServerSocket: " + e);
            }
        }

Это зеркальный сервер...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.