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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сокеты, прием данных 
V
    Опции темы
Dray
Дата 3.7.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


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

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



Пишу учебный пример - небольшой клиент-сервер. Серверная часть:
Код
private void OnListen ()
    {
        m_BtnConnect.setEnabled(false);
        m_BtnListen.setEnabled(false);
        try
        {
            m_sock = new ServerSocket(6699);
            int a = m_sock.getLocalPort();
            System.out.println (a);
            m_con_sock = m_sock.accept();
            m_ChatScreen.setText(m_ChatScreen.getText() + "Client\n");
            byte[] b = new byte[128];
            int c = m_con_sock.getInputStream().read(b);
            String str = new String (b);
            StringBuffer strb = new StringBuffer(str);
            str = strb.substring(0, c);
            m_ChatScreen.setText(m_ChatScreen.getText() + str);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

Клиентская часть:
Код
private void OnConnect ()
    {
        try
        {
            m_con_sock = new Socket("127.0.0.1", 6699);

            m_ChatScreen.setText(new StringBuffer().append(m_ChatScreen.getText()).append("Connected!").toString());
            m_con_sock.getOutputStream().write(new String ("Hello\n").getBytes());
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

Никак не могу понять как организовать прием данных. Ведь нельзя же в цикле вот это вытворять:
Код
byte[] b = new byte[128];
int c = m_con_sock.getInputStream().read(b);
String str = new String (b);
StringBuffer strb = new StringBuffer(str);
str = strb.substring(0, c);
m_ChatScreen.setText(m_ChatScreen.getText() + str);

Мож через какие-нибудь события это делается? 


--------------------
忍者

user posted image
PM MAIL   Вверх
LSD
Дата 3.7.2006, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Нет, именно так и делается. У сокетов нет механизма оповещения о том, что новая порция данных получена. Если хочешь можешь использовать BufferedReader, он реализует этот цикл за тебя. 


--------------------
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   Вверх
Dray
Дата 4.7.2006, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


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

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



Вот тогда еще вопросик:
Код
class MessageGetterThread extends Thread
    {
        public void run ()
        {
            while (true)
            {
                try
                {
                    byte[] b = new byte[128];
                    int c = m_con_sock.getInputStream().read(b);
                    System.out.println(c);
                    String str = new String (b);
                    StringBuffer strb = new StringBuffer(str);
                    str = strb.substring(0, c);
                    m_ChatScreen.setText(m_ChatScreen.getText() + str);
                    sleep(100);   //Вот сдесь вопрос

                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
                catch (SocketException sexc)
                {
                    m_ChatScreen.setText(m_ChatScreen.getText() + sexc.getMessage());
                    break;
                }
                catch (IOException ioe)
                {
                    ioe.printStackTrace();
                }
            }
        }
    }

С целью чтоб цикл не загружал систему, я в каждой итерации делаю вот так:
Код
sleep (100);

Это нормально так делать? Или надо по-другому? Еще знаю про приарететы, но не знаю как применить. 


--------------------
忍者

user posted image
PM MAIL   Вверх
ptr
Дата 4.7.2006, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А зачем так делать? Если данных нет, то программа будет ждать на read'е пока они не придут.  

Это сообщение отредактировал(а) ptr - 4.7.2006, 06:42


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Dray
Дата 4.7.2006, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


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

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



ptr, Аааа! Я думал будет кидать пустую строку со скоростью процессора. Спасибо за помощь - убераю. 


--------------------
忍者

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.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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