Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Отправка данных сеть.


Автор: val 22.9.2005, 18:24
Привет, всем!

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

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();


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

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

Автор: COVD 22.9.2005, 18:55
может вам вместо wait..() поставить outputStream.flash() и outputStream.close() ?

Автор: val 23.9.2005, 09:22
Цитата
может вам вместо wait..() поставить outputStream.flash() и outputStream.close() ?


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

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

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

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


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();
}


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

Автор: COVD 26.9.2005, 15:03
Какая-то странная проблема. Как вы определяете, что сокет ничего не отправляет? Согласно протоколу TCP/IP сокет может делать несколько попыток отправить данные, пока не получит подтверждения приемной стороны, что все данные получены.

Автор: val 26.9.2005, 16:08
Цитата
Как вы определяете, что сокет ничего не отправляет?


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

Автор: 02077461 26.9.2005, 16:13
Код

    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);
            }
        }

Это зеркальный сервер...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)