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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из сокета 
:(
    Опции темы
knave
Дата 21.1.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 6.3.2003
Где: Санкт-Питербург ( Россия)

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



Делаю апплет (JBilder 2006) который принимает данные по сети через TCP от программы напсанной на С.

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

Код ниже
Код

 public void run()
  {
    int     code = 0;
    byte    buf[] = null;

    System.out.print("Media tracker...");
    m_mediaTracker = new MediaTracker(this);
    System.out.println("OK");
    
    try
    {
      System.out.print("Connect...");
      m_sock = new Socket("127.0.0.1", 777);
      send(m_sock.getOutputStream(), "InitialString".getBytes());
      System.out.println("OK");
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }

    while(m_isRun)
    {
      try
      {
        System.out.print("Recv code...");
        code = recvInt(m_sock.getInputStream());
        System.out.println("OK");
      }
      catch(IOException e)
      {
        e.printStackTrace();
      }

      if (code == 3)
      {
    try
    {
          System.out.print("Data...");
      buf = recv(m_sock.getInputStream());
          System.out.println("OK");
    }
    catch(IOException e)
    {
      e.printStackTrace();
    }

    if (buf.length > 0)
    {
        Image image = Toolkit.getDefaultToolkit().createImage(buf, 0 , buf.length);

        m_mediaTracker.addImage(image, 0);

        try
        {
          m_mediaTracker.waitForID(0);
        }
        catch(Exception e)
        {
          e.printStackTrace();
        }

        if (!m_mediaTracker.isErrorID(0))
        {
              getGraphics().drawImage(image, 0, 0, this);
            }

            m_mediaTracker.removeImage(image, 0);
    }





 static private int makeInt(int buf[])
  {
    int  res = 0;

    res = buf[0];
    res |= buf[1] << 8;
    res |= buf[2] << 16;
    res |= buf[3] << 24;

    return res;
  }








  static  private int recvInt(InputStream strm)
  {
      int   dataLen = 0, i = 0, res = 0;
      int   buf[] = null;

      try
      {
    buf = new int[4];
    buf[0] = strm.read();
    buf[1] = strm.read();
    buf[2] = strm.read();
    buf[3] = strm.read();

    dataLen = makeInt(buf);
      }
      catch(IOException e)
      {
    e.printStackTrace();
    return 0;
      }

      buf = new int[dataLen];

      try
      {
    for (i = 0; i < dataLen; i++)
    {
      buf[i] = strm.read();
    }
      }
      catch(IOException e)
      {
    e.printStackTrace();
    return 0;
      }

    res = buf[0];
    res |= buf[1] << 8;
    res |= buf[2] << 16;
    res |= buf[3] << 24;

    return res;
  }









  static private byte[] recv(InputStream strm)
  {
      int   dataLen = 0, i;
      int   buf[] = null;
      byte  buf1[] = null;

      try
      {
    buf = new int[4];
    buf[0] = strm.read();
    buf[1] = strm.read();
    buf[2] = strm.read();
    buf[3] = strm.read();

    dataLen = makeInt(buf);
      }
      catch(IOException e)
      {
    e.printStackTrace();
    return null;
      }

      buf1 = new byte[dataLen];

      try
      {
    for (i = 0; i < dataLen; i++)
    {
      buf1[i] = (byte)strm.read();
    }
      }
      catch(IOException e)
      {
    e.printStackTrace();
    return null;
      }

    return buf1;
  }











--------------------
С наилучшими пожеланиями !!!
PM MAIL ICQ   Вверх
LSD
Дата 21.1.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(knave @ 21.1.2006, 17:48 Найти цитируемый пост)
В отладчике данные принимаются нормально, стоит только запустить на выполнение без отладки, как все подвисает на чтении из сокета.

Запустить в JBuilder или в браузере? И как определил что подвисает на чтении из сокета?


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


Зануда
***


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

Репутация: 1
Всего: 3



knave
Можешь показать весь класс, я думаю что знаю в чём дело.


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
knave
Дата 22.1.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 6.3.2003
Где: Санкт-Питербург ( Россия)

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



Я ставил логирование в мою обертку для чтения из сокета, подвисало на первом чтении из сокета. Так как будто ждет данные а они не приходят.

Может с секюрити какая нить заморочка (я новичек в яве...)

Вот весь класс

Код

package testapplet;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
import java.net.*;
import java.lang.*;


/**
 * Title:
 * Description:
 * Copyright:    Copyright (c) 2006
 * Company:
 * @author
 * @version 1.0
 */

public class MyApplet extends Applet implements Runnable
{
  boolean             isStandalone = false;
  Socket              m_sock = null;
  InputStream         m_in = null;
  OutputStream        m_out = null;
  Thread              m_thread = null;
  MediaTracker        m_mediaTracker = null;
  boolean             m_isRun = false;


  /**Get a parameter value*/
  public String getParameter(String key, String def)
  {
      return isStandalone ? System.getProperty(key, def) :
        (getParameter(key) != null ? getParameter(key) : def);
  }

  /**Construct the applet*/
  public MyApplet()
  {
  }

  /**Initialize the applet*/
  public void init()
  {
    try
    {
      jbInit();
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
  /**Component initialization*/
  private void jbInit() throws Exception
  {
  }


  static synchronized private int send(OutputStream strm, byte data[])
  {
      DataOutputStream dataOut = new DataOutputStream(strm);
      int   dataLen = data.length;

      try
      {
    dataOut.writeInt(dataLen);
    dataOut.flush();
      }
      catch(IOException e)
      {
    e.printStackTrace();
    return -1;
      }


      try
      {
    dataOut.write(data, 0, dataLen);
    dataOut.flush();
      }
      catch(IOException e)
      {
    e.printStackTrace();
    return -1;
      }

      return 0;
  }
  static private int makeInt(int buf[])
  {
    int  res = 0;

    res = buf[0];
    res |= buf[1] << 8;
    res |= buf[2] << 16;
    res |= buf[3] << 24;

    return res;
  }

  static  private int recvInt(InputStream strm)
  {
      int   dataLen = 0, i = 0, res = 0;
      int   buf[] = null;

      try
      {
    buf = new int[4];
        System.out.print("Read 1...");
        buf[0] = strm.read();
        System.out.println("OK");
    buf[1] = strm.read();
    buf[2] = strm.read();
    buf[3] = strm.read();

    dataLen = makeInt(buf);
      }
      catch(IOException e)
      {
    e.printStackTrace();
    return 0;
      }

      buf = new int[dataLen];

      try
      {
    for (i = 0; i < dataLen; i++)
    {
      buf[i] = strm.read();
    }
      }
      catch(IOException e)
      {
    e.printStackTrace();
    return 0;
      }

    res = buf[0];
    res |= buf[1] << 8;
    res |= buf[2] << 16;
    res |= buf[3] << 24;

    return res;
  }


  static private byte[] recv(InputStream strm)
  {
      int   dataLen = 0, i;
      int   buf[] = null;
      byte  buf1[] = null;

      try
      {
    buf = new int[4];
        
        System.out.print("Read 1...");
    buf[0] = strm.read();
        System.out.println("OK");
    buf[1] = strm.read();
    buf[2] = strm.read();
    buf[3] = strm.read();

    dataLen = makeInt(buf);
      }
      catch(IOException e)
      {
    e.printStackTrace();
    return null;
      }

      buf1 = new byte[dataLen];

      try
      {
    for (i = 0; i < dataLen; i++)
    {
      buf1[i] = (byte)strm.read();
    }
      }
      catch(IOException e)
      {
    e.printStackTrace();
    return null;
      }

    return buf1;
  }

  /**Start the applet*/
  public void start()
  {
    m_isRun = true;
    if (m_thread == null)
    {
      System.out.print("Start...");
      m_thread = new Thread(this);
      m_thread.start();
      System.out.println("OK");
    }
  }

  public void run()
  {
    int     code = 0;
    byte    buf[] = null;

    System.out.print("Media tracker...");
    m_mediaTracker = new MediaTracker(this);
    System.out.println("OK");

    try
    {
      System.out.print("Connect...");
      m_sock = new Socket("127.0.0.1", 777);
      send(m_sock.getOutputStream(), "InitialString".getBytes());
      System.out.println("OK");
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }

    while(m_isRun)
    {
      try
      {
        System.out.print("Recv code...");
        code = recvInt(m_sock.getInputStream());
        System.out.println("OK");
      }
      catch(IOException e)
      {
        e.printStackTrace();
      }

      if (code == 3)
      {
    try
    {
          System.out.print("Data...");
      buf = recv(m_sock.getInputStream());
          System.out.println("OK");
    }
    catch(IOException e)
    {
      e.printStackTrace();
    }

    if (buf.length > 0)
    {
        Image image = Toolkit.getDefaultToolkit().createImage(buf, 0 , buf.length);

        m_mediaTracker.addImage(image, 0);

        try
        {
          m_mediaTracker.waitForID(0);
        }
        catch(Exception e)
        {
          e.printStackTrace();
        }

        if (!m_mediaTracker.isErrorID(0))
        {
              getGraphics().drawImage(image, 0, 0, this);
            }

            m_mediaTracker.removeImage(image, 0);
    }
      }
    }

    try
    {
      m_sock.close();
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }

  }

  /**Stop the applet*/
  public void stop()
  {
    m_isRun = false;

  }
  /**Destroy the applet*/
  public void destroy()
  {
  }
  /**Get Applet information*/
  public String getAppletInfo()
  {
    return "Applet Information";
  }
  /**Get parameter info*/
  public String[][] getParameterInfo()
  {
    return null;
  }
  /**Main method*/
  public static void main(String[] args)
  {
    MyApplet applet = new MyApplet();
    applet.isStandalone = true;
    Frame frame;
    frame = new Frame()
    {
      protected void processWindowEvent(WindowEvent e)
      {
        super.processWindowEvent(e);
        if (e.getID() == WindowEvent.WINDOW_CLOSING)
    {
          System.exit(0);
        }
      }
      public synchronized void setTitle(String title)
      {
        super.setTitle(title);
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
      }
    };
    frame.setTitle("Applet Frame");
    frame.add(applet, BorderLayout.CENTER);
    applet.init();
    applet.start();
    frame.setSize(400,320);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2);
    frame.setVisible(true);
  }
}




--------------------
С наилучшими пожеланиями !!!
PM MAIL ICQ   Вверх
LSD
Дата 22.1.2006, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(knave @ 22.1.2006, 16:09 Найти цитируемый пост)
Может с секюрити какая нить заморочка (я новичек в яве...)

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

И все же, где он у тебя встает, 112 строка или 219?


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 6.3.2003
Где: Санкт-Питербург ( Россия)

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



На строке 112.
Я его там все через 127.0.0.1 делаю, с секюрити в этом случае думаю проблем быт недолжно, запускаю в отладчике (не через браузер). При этом в пошаговом режиме то он работает а когда просто запускаеш то нет (так же из студии).
Добавлено @ 11:39
Да, никаких эксцепшенов не вылетает, я их там всех печатаю в окно информации.


--------------------
С наилучшими пожеланиями !!!
PM MAIL ICQ   Вверх
COVD
Дата 23.1.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Так как будто ждет данные а они не приходят.


значит , не приходят. Метод read() - блокирующий, ждет пока байт придет. Может сервер не отсылает?

PM MAIL   Вверх
knave
Дата 23.1.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 6.3.2003
Где: Санкт-Питербург ( Россия)

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



Цитата

значит , не приходят. Метод read() - блокирующий, ждет пока байт придет. Может сервер не отсылает?

а когда в отладчике хожу пошагово по аплету то, приходит??? Как то странно. Вот если бы он и в пошаговой отладке не приходил тогда ладно, а так кат о непонятно.
Сервер то же блокирующий, прием в програме на С работает нормально, а в яве как то странно.


--------------------
С наилучшими пожеланиями !!!
PM MAIL ICQ   Вверх
LSD
Дата 23.1.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



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

Давай упростим пример до предела, один main() в нем открываем сокет, читаем данные, шлем ответ и закрываем его. Хоть будет ясно проблема в Java или нет.

P.S. Еще один момент, у меня была проблема с долгим коннектом (порядка 30-50 секунд) в JDK 1.5.X, проблема была решена с выходом 1.5.0_06, если ты используешь JDK из состава JBuilder то эта проблема у тебя наличествует.


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


Эксперт
***


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

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



Вы по-байтно читаете, потому что на С другой порядок представления целых чисел? Тогда уж надо readByte использовать, потому что read() возвращает int 0..255 и вы неправильно восстановите целое число, если оно > 127. Но наверное к текущей проблеме это отношения не имеет.
PM MAIL   Вверх
LSD
Дата 23.1.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(COVD @ 23.1.2006, 17:59 Найти цитируемый пост)
Вы по-байтно читаете, потому что на С другой порядок представления целых чисел?

На интеловских машинах да. Си будет писать как little endian, а Java читать как big endian (по умолчанию, но можно ее переучить smile ).

Цитата(COVD @ 23.1.2006, 17:59 Найти цитируемый пост)
Тогда уж надо readByte использовать, потому что read() возвращает int 0..255 и вы неправильно восстановите целое число, если оно > 127.

В InputStream нет метода readByte. А если полученный int привести к byte, то получим корректное значение. Так что тут все нормально.


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


Эксперт
***


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

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



да, действительно, кастинг умный smile
PM MAIL   Вверх
knave
Дата 24.1.2006, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 6.3.2003
Где: Санкт-Питербург ( Россия)

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



JDK из билдера, но коненк по логам проходит, она как бы данные не видит. Надо дейвительно поробовать в майне все сделать....

Да, а где взять JDK нормальный?


--------------------
С наилучшими пожеланиями !!!
PM MAIL ICQ   Вверх
LSD
Дата 24.1.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(knave @ 24.1.2006, 12:02 Найти цитируемый пост)
Да, а где взять JDK нормальный?

JDK 5.0 Update 6. Поставишь затем добавишь ее в Tools\Configure\JDK's, и в свойствах проекта укажешь использовать эту JDK.


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 6.3.2003
Где: Санкт-Питербург ( Россия)

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



Спасибо, ща скачаю, дома попробую.


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

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

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


 




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


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

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