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

Поиск:

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


Program developer
**


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

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



Привет!
Можно ли как-то узнать количество отправленных и неотправленных данных в текущий момент в стриме. Проблема возникла из-за того, что в сокет данные пишутся интенсивно, а вот отправляются медленно, а процесс надо как-то контролировать... Спасибо.  


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


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 118



Это сложно - если данные идут через какой-нибудь свитч, то там они могу застревать. И тут уже вряд ли что сделать можно.
PM MAIL WWW ICQ   Вверх
val
Дата 14.6.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


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

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



Ну мне хотя бы знать, сколько ушло просто в сеть.  Ведь непременно сокет должен знать сколько у него еще данных на отправку записано...


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


software saboteur
****


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

Репутация: 2
Всего: 159



Цитата(val @  14.6.2007,  18:27 Найти цитируемый пост)
Ну мне хотя бы знать, сколько ушло просто в сеть.  Ведь непременно сокет должен знать сколько у него еще данных на отправку записано... 


Есть такой вариант: написать адаптер для OutputStream, который будет реализовывать логику учёта количества переданных байт. 
Можно получить поток от сокета, установить его адаптеру (например методом setOutputStream(OutputStream os)) и используя методы адаптера посылать в поток данные. Т.е. адаптер выступает классом-прослойкой между потоком и остальной логикой, он делегирует большинство операций непосредственно OutputStream-у, но при этом навешивает способность учёта количества переданных байт. Поскольку интерфейсы у адаптера и OutputStream будут различаться (т.е. не все методы класса OutputStream будут объявлены в классе адаптера), то не стоит путать его с шаблоном декоратор (который в свою очередь обладает таким же (или расширяющим) интерфейсом что и "декарируемый" им класс). Впрочем и декоратор тут подойдёт, но как мне кажется его реализация будет несколько сложнее.

вот некоторые ссылки: про адаптер, про декоратор



--------------------
user posted image нет времени думать - нужно писать КОД!

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


Program developer
**


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

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



Цитата

Есть такой вариант: написать адаптер для OutputStream, который будет реализовывать логику учёта количества переданных байт. 


 smile 


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


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



У Jakarta commons-io, есть класс CountingInputStream, который считает количество переданных байт.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
powerOn
Дата 16.6.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 2
Всего: 159



В самом примитивном варианте:

Интерфейс адаптера:
Код

import java.io.OutputStream;

public interface  MyOutputStreamAdapter
{
    public void write(String message);
    public OutputStream getOutputStream();
    public void setOutputStream(OutputStream outputStream);
    public int getWritedCount();
    public void clearWritedCount();
}


Реализация адаптера:
Код

import java.io.OutputStream;

public class MyOutputStreamAdapterImpl implements MyOutputStreamAdapter
{
    private OutputStream outputStream = null;
    private int writeCount = 0;

    public MyOutputStreamAdapterImpl()
    {
    }
    
    public void write(String message)
    {
        if (outputStream != null)
        {
            try
            {
                outputStream.write(message.getBytes());
                writeCount += message.length();
            }
            catch (IOException ex)
            {
                ex.printStackTrace();
            }
        }
    }
    
    public int getWritedCount()
    {
        return writeCount;
    }
    
    public void clearWritedCount()
    {
        writeCount = 0;
    }
    
    public OutputStream getOutputStream()
    {
        return outputStream;
    }
    
    public void setOutputStream(OutputStream outputStream)
    {
        this.outputStream = outputStream;
    }
}


Пример использования:
Код

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Main
{
    public Main()
    {
    }

    public static void main(String[] args)
    {
        try
        {
            FileOutputStream fos = new FileOutputStream(new File("test.txt"));
            MyOutputStreamAdapter adapter = new MyOutputStreamAdapterImpl();
            
            adapter.setOutputStream(fos);
            
            adapter.write("Test String!");
            adapter.write("Test String!");
            adapter.write("Test String!");
            
            System.out.println(adapter.getWritedCount());
            fos.close();
            
        } catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}



--------------------
user posted image нет времени думать - нужно писать КОД!

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


Program developer
**


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

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



powerOn, в своем примере ты сделал чистую надстройку над OutputStream, которая просто считает сколько данных записано в стрим. Мой вопрос немного глубже, мне надо знать
Цитата

количество отправленных и неотправленных данных 
. Пример. В стрим я записал 50 байт. Через некоторое время хочу знать, сколько еще осталось в стриме из этих 50-ти байт  неотправленных...


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


software saboteur
****


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

Репутация: 2
Всего: 159



Цитата(val @  16.6.2007,  15:57 Найти цитируемый пост)
powerOn, в своем примере ты сделал чистую надстройку над OutputStream, которая просто считает сколько данных записано в стрим. 

Верно. smile


Цитата(val @  16.6.2007,  15:57 Найти цитируемый пост)
Пример. В стрим я записал 50 байт. Через некоторое время хочу знать, сколько еще осталось в стриме из этих 50-ти байт  неотправленных...


Мне кажется в таком случае есть три  варианта:
1) Использовать приведённый мной, но взять за правило, что все что записано в поток и за flush-но ушло клиенту, если никаких исключений не  вылетело.
2) Опрашивать клиента с вопросом "сколько данных тебе пришло?" и  сравнивать с тем сколько отправил.
3) Посмотреть класс CountingInputStream, который тебе посоветовал LSD. 


--------------------
user posted image нет времени думать - нужно писать КОД!

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

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

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


 




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


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

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