как узнать сколько байт записано в OutputStream
От: Alexandr.Martynov http://amartyno.blogspot.com/
Дата: 28.09.06 11:09
Оценка:
есть клиент, который общается с сервером через сокеты, но в ходе разработки возникла задача узнать сколько байт было записано в поток (из-за того что сервер очень не стабилен и периодически отваливается).
    private void write(String data) throws Exception
    {
        OutputStream out = WVSocket.getOutputStream();
        try
        {
            out.write(data.getBytes());
            out.flush();
        }
        catch (Exception e)
        {
            WVSocket.setSocketState(WidevineProxy.SOCKET_NOT_CONNECTED);
            composingError("WidevineProxy.write: ", e);
        }
    }


OutputStream.write() ничего не возвращает
Re: как узнать сколько байт записано в OutputStream
От: Аноним  
Дата: 28.09.06 14:25
Оценка: +1
Здравствуйте, Alexandr.Martynov, Вы писали:

AM>есть клиент, который общается с сервером через сокеты, но в ходе разработки возникла задача узнать сколько байт было записано в поток (из-за того что сервер очень не стабилен и периодически отваливается).


Наверное более полезно знать, сколько байт получено на сервере. Запись в поток еще не означает их получение.
Re[2]: как узнать сколько байт записано в OutputStream
От: Alexandr.Martynov http://amartyno.blogspot.com/
Дата: 28.09.06 14:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Alexandr.Martynov, Вы писали:


AM>>есть клиент, который общается с сервером через сокеты, но в ходе разработки возникла задача узнать сколько байт было записано в поток (из-за того что сервер очень не стабилен и периодически отваливается).


А>Наверное более полезно знать, сколько байт получено на сервере. Запись в поток еще не означает их получение.


и тот и тот вариант подойдет. Моя задача убедится что информация ушла, а дошла она или нет это проблема скорее администратора сети на стороне клиента.
Re[3]: как узнать сколько байт записано в OutputStream
От: Donz Россия http://donz-ru.livejournal.com
Дата: 28.09.06 14:47
Оценка:
Здравствуйте, Alexandr.Martynov, Вы писали:

AM>>>есть клиент, который общается с сервером через сокеты, но в ходе разработки возникла задача узнать сколько байт было записано в поток (из-за того что сервер очень не стабилен и периодически отваливается).


А>>Наверное более полезно знать, сколько байт получено на сервере. Запись в поток еще не означает их получение.


AM>и тот и тот вариант подойдет. Моя задача убедится что информация ушла, а дошла она или нет это проблема скорее администратора сети на стороне клиента.


Если работаешь через сокеты, то значит используешь стек TCP. В TCP пакеты или доходят в той же очередности, что и уходили от клиента, или ты в приложении получишь ошибку передачи данных (IOException), если я не ошибаюсь
Re[4]: как узнать сколько байт записано в OutputStream
От: Alexandr.Martynov http://amartyno.blogspot.com/
Дата: 28.09.06 15:11
Оценка:
Здравствуйте, Donz, Вы писали:

D>Здравствуйте, Alexandr.Martynov, Вы писали:


AM>>>>есть клиент, который общается с сервером через сокеты, но в ходе разработки возникла задача узнать сколько байт было записано в поток (из-за того что сервер очень не стабилен и периодически отваливается).


А>>>Наверное более полезно знать, сколько байт получено на сервере. Запись в поток еще не означает их получение.


AM>>и тот и тот вариант подойдет. Моя задача убедится что информация ушла, а дошла она или нет это проблема скорее администратора сети на стороне клиента.


D>Если работаешь через сокеты, то значит используешь стек TCP. В TCP пакеты или доходят в той же очередности, что и уходили от клиента, или ты в приложении получишь ошибку передачи данных (IOException), если я не ошибаюсь


в том-то и дело что ошибок никаких не выскакивает, а вот в момент вызова функции read все зависает

...

sock.setSoTimeout(0);

...

InputStream in = sock.getInputStream();

byte[] c = new byte[1];

in.read(c); //дальше программа не выполняется и текст "Done." на экран не выводится.

System.out.println("Done.");


in.available(); всегда возвращает 0.

собственно поэтому и хочу узнать а было ли что-то записано.

P.S. никакой возможно посмотреть что творится на сервере у меня нет
Re[5]: как узнать сколько байт записано в OutputStream
От: victa  
Дата: 28.09.06 16:40
Оценка:
Здравствуйте, Alexandr.Martynov, Вы писали:


AM>в том-то и дело что ошибок никаких не выскакивает, а вот в момент вызова функции read все зависает


AM>
AM>...

AM>sock.setSoTimeout(0);

AM>...

AM>InputStream in = sock.getInputStream();

AM>byte[] c = new byte[1];

AM>in.read(c); //дальше программа не выполняется и текст "Done." на экран не выводится.

AM>System.out.println("Done.");
AM>


AM>in.available(); всегда возвращает 0.


AM>собственно поэтому и хочу узнать а было ли что-то записано.


AM>P.S. никакой возможно посмотреть что творится на сервере у меня нет


То что "зависает" на методе read говорит только о том что в твоем InputStream ничего нет, т.е. сервер ничего тебе не посылает.
Саиый простой способ протестировать твой сокет — создать локально(на своей же машине или на какой то машине во внутренней сети) свой сервер и отладить работу сокетов на нем.

Еще такое соображение. Насколько я помню, если сокет "отваливается" на стороне сервера, то клиент не уведомляется. Он будет благополучно висеть в своем треде на методе read и ждать ответа. Я выходил из подобной ситуации таким образом — устанавливал время тайм аута sock.setSoTimeout(nt); и через промежутки времени меньше nt посылал контрольный сигнал. если в течение установленного времени ответа на контрольный сигнал не было — закрывал сокет у клиента и устанавливал новое соединение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.