Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Java Programmers FAQ. [По моей "внутpенней" нумеpации - часть 26]

0 views
Skip to first unread message

Andrew Kuksov

unread,
Apr 23, 1999, 3:00:00 AM4/23/99
to


Пpивет, All! Посети http://www.chat.ru/~acandrew
> Пеpевод: Воpонков Алексей, otk.unets.ru!v...@otk.unets.ru

*(Секция 15) Почему < Windows RMI/мой java debugger/IDE/другое> зависает
на несколько минут если мой Windows PC не подключен к Интернету?

[*] Java имеет встроеную сетевую поддержку. Когда Java программа стартует,
автоматически загружается Winsock DLL. Первое, что она пытается выполнить,
это определить (resolve) полностью квалифицированное имя домена для машины
"localhost". Если в Вашей системе не описано это имя, она будет пытаться
запросить его у сервера имен Интернета, который обычно находится у Вашего
провайдера Интернет (ISP). Поэтому система либо запросит Вас подключиться к
провайдеру Интернет, либо будет ждать пока не истечет время попытки.

Есть мнение, что можно избежать этой проблемы в Win95 дав определив в
системе другой способ определять DNS имена. У меня это не работает.
Отредактируйте файл hosts Вашей системы так, чтобы localhost и полное имя
домена были оба определены. В Windows 95 файл hosts находитися в
%windir%\HOSTS (например, C:\WINDOWS\HOSTS). В Windows NT файл hosts
находится в: %windir%\System32\DRIVERS\ETC\HOSTS например,
C:\WINNT\System32\DRIVERS\ETC\HOSTS).
В Win95 есть ловушка, которая заключается в том, что если последняя запись
не заканчивается символами carriage-return/line-feed, то файл hosts
читается не до конца. Так, если система называется goober.best.com
приведите файл hosts от вида


127.0.0.1 localhost


к виду


127.0.0.1 goober.best.com localhost


Файл может выглядеть следующим образом:

# Hosts file
127.0.0.1 localhost
129.146.77.177 goober


Другой способ состоит в том, чтобы установить PPP соединение с провайдером
Интернет всякий раз, когда Вы будете запускать сетевые программы.

Опыт некоторых людей говорит о том, что работа с сетью не совсем
удовлетворительна под Windows95 с использованием Winsock 1.1, и время от
времени необъяснимо глючит. Вы можете попытаться загрузить Winsock 2.0.
Чтобы получить Winsock 2.0, Вы должны вытащить его из набора Microsoft
Windows Sockets 2.0 Software Development Kit. Этот софт может быть получен
со следующих адресов:
http://www.microsoft.com/win32dev/netwrk/winsock2/ws295sdk.html или:
ftp://ftp.microsoft.com/bussys/WinSock/winsock2/

Патчи, которые нужны для улучщения работы в сети уже есть в Win98.

Другие Сетевые Вопросы

*(Секция 15) Если я вызываю InetAddress.getByName() метод с аргументом IP
- адресом в виде строки, типа "192.168.0.1", получаю на некоторых (но не на
всех) платформах UnknownHostException. Код :

Socket sock = new Socket("155.152.5.1", 23);

бросает исключение. Почему?

[*] Это платформенное различие, которое возникает из различной семантики
лежащих в основе сетевых библиотек, и пофиксено в JDK 1.1. В Solaris и
Windows NT, строка IP адреса работает только для тех адресов, которые имеют
ассоциированное имя хоста. Hа Linux и Windows 95 строки IP адреса
срабатывают всегда.
Когда создается экземпляр InetAddress с IP адресом в качестве параметра,
выполняется обратное DNS преобразование. Если IP адрес не ассоциирован с
правильным именем хоста, то создание экзепляра класса InetAddress потерпит
неудачу. Это является частью борьбы с DNS-spoofing (подмена DNS), и в JDK
1.1 работает потому что обратное преобразование не происходит пока имя
хоста не запрошено. Так в JDK 1.1,

InetAddress in = InetAddress.getByName("155.152.5.1");


[Note: Эту информацию нужно подтвердить. Сетевые гуру?]
Другие сайты:

У Microsoft есть несколько network-related патчей на их сайте
http://www.microsoft.com/

*(Секция 15) Я хочу передать class файл всем тем желающим, кто использует
мой апплет. Есть идеи насчет того как?

[*] Ты должен использовать маленькую хитрость: разместить твой .class
файл(ы) в .zip архиве и использовать метод showDocument() от URL. Hекто,
обращаясь к этому URL получит окно диалога, в котором он будет запрошен о
сохранении файла на его локальном диске.
Другие сайты:

Вы можете увидеть это живьем и попробовать на себе на:
http://www.best.com/~rmlynch/saveit.html

*(Секция 15) Как заставить URLConnection работать через proxy firewall?
Т.е. Как заставить Java приложение выполнять доступ к Web через прокси?

[*] Это обычно нужно для любого сетевого доступа к другому домену. Вы
должны задать runtime системе что Вы пытаетесь сделать используя аргументы
командной строки когда запускаете программу.

java -DproxySet=true -DproxyHost=SOMEHOST -DproxyPort=SOMENUM code.java

Отметтье, что proxyPort является опциональным и по умолчанию равен 80. Без
этого Вы увидите исключение типа java.net.UnknownHostException или
java.net.NoRouteToHostException

Установки прокси работают и для java.net.URLConnection, и для
java.net.Sockets.

Netscape'вская и IE'ая JVMs (виртуальные Java машины) (по крайней мере в
версиях 4.х+) принимают установки прокси для апплетов из конфигурации
прокси браузера. Вы можете также работать с прокси в проиложениях (не
апплетах) добавив следующие строки


// установите чтобы использовать прокси
System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost", "myproxy.server.name");
System.getProperties().put("proxyPort", "80");


Hо как мне узнать имя прокси сервера?
Этот код просто говорит Вам как можно получить URL соединение через прокси.
Hо так как это Ваш прокси сервер, то предполагается, что Вы знаете его имя.
И не существует кода, который можно написать, который позволит произвольным
URL соединениям быть инициироваными извне firewall'а. Подумайте об этом!
Если бы это было так, то firewall не выполнял бы свою работу.

Также отметтье, что существуют соответствующие socksProxyPort и
socksProxyHost когда socks используются вместо прокси. Socks порт по
умолчанию - 1080.

*(Секция 15) Что означает "swizzle"(неточный синоним - взбить[коктейль]),
например "Swizzle an object?"

[*] Это означает сериализовать. "To swizzle an object" означает рекурсивно
сериализовать созданные объекты.

*(Секция 15) Я использую возможности ссериализации в 1.1 чтобы сохранить
некоторые объекты на диске. Я добавил новое поле в один из моих объектов,
который сериализуется и теперь десериализация моих старых объектов больше
не работает. Я получаю такое исключение :


java.io.InvalidClassException: MacroData; Local class not compatible


[*] Вам нужно добавить объявление типа


static final long serialVersionUID = 4021215565287364875L;


в модифицированный класс. Актуальное значение этого длинного целого
предоставляется утилитой "serialver", которая есть в JDK. Любая отличная от
первой версия класса требует, чтобы эта статическая переменная была
определена в классе.

*(Секция 15) Мой код работающий с сокетами выглядит правильным, но не
работает!

[*] При использовании сокетов Вы обычно открываете оба входящий и исходящий
потоки. TCP соединение является полнодуплексным, но либо отсылающая, либо
принимающая стороны могут закрываться независимо. По умолчанию, когда
установлено что удаленная сторона закрыла соединение, локальная сторона
просто закрывает его. Проверьте, может быть это случается с Вами
добавлением соответствующей пары. Используйте tcpdump чтобы проверить это.

*(Секция 15) Как мне получить соответствие IP адреса и имени хоста?

[*] В Java 1.1 (ранние версии были глюкавыми) используйте:


String host = InetAddress.getByName("211.10.2.119").getHostName();


*(Секция 15) Как мне встроить якорь (anchor) в URL? Просто поместить его
как часть строки в конструктор не работает.

[*] Что-то типа:


URL url = new URL("http://www.my_domain.com/my_page.html");
URL anchor = new URL(url, "#section2");
this.getAppletContext().showDocument(anchor);


Andrew. _/[acan...@chat.ru]/_
... - Как паковал? - РАКом!

0 new messages