Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > net share


Автор: Dweep 4.11.2005, 22:57
Как посмотреть список росшареных ресурсов на компе с произвольным айпишником в сети. Я использую следующий код:

ShellFolder folder = ShellFolder.getShellFolder(new File("c:/"));
while (folder.getParentFile() != null)
folder = (sun.awt.shell.ShellFolder)folder.getParentFile();

Потом получая масив файлов, и приводя их к типу ShellFolder получаю сылку на сеть, робочие групы, компьютеры, ресурсы на компьютерах.
Проблема в том, что этот способ работает только если мой виндовс(XP) может увидеть эти компьютеры. Обычно (у нас в групе около 200 компов) отображается только несколько машин, но на любой комп без проблем можна зайти набрав \\name_comp или \\IP

Автор: pvo 5.11.2005, 12:20
ответил тебе в соседнем треде - посмотри в сторону jcifs.org

Автор: Dweep 6.11.2005, 03:04
Цитата

1. Твой код не будет работать под *nix системами. Для того, чтобы получить универсальный код, я бы на твоем месте посмотрел на проект jcifs.org. Скорость при его использовании не засекал, но вроде пошустрее. Основное время вроде тратилось на установление smb сессии, доступ же к ресурсам шел быстро. Но не стоит расчитывать, что все будет работать мгновенно.

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

3. При использовании jcifs тебе не нужно будет проверять, открыт ли 139 порт - при попытке обращения ты просто получишь exception в случае, если порт закрыт.


Клас: http://jcifs.samba.org. меня приятно удивил, я уже почти был уверен что java не умеет определять список шар по айпишнику. Но все же есть проблема: есть несколько компьютеров (примерно 5%), которые имеют шары, связь с ними сравнительно быстрая, но SmbFile[] st = f.listFiles(); - выдает jcifs.smb.SmbException

у SmbFile есть метод setConnectTimeout(по умолчанию 0), Exception выкидывает независимо от его значения. Поэтому у меня возникло 2 вопроса:
1. Можно ли обойти это исключение, т.е. увидеть ресурсы на этих компах
2. Скиньте ссылку на ОpenSourse class похожий по функциональности.

Автор: pvo 6.11.2005, 12:07
Цитата(Dweep @ 6.11.2005, 03:04)
http://jcifs.samba.org.
Сорри за неправильно данную ссылку - перепутал.
Насчет ошибки:
1. кинь сюда стектрейс и фрагмент кода, в котором он возникает.
2. Отличаются ли чем-нить машины, при обращении к которым возникает ошибка, от остальных? Какая на них ос, например. Нет ли проблем при обращении к этим машинам по windows сети? М.б. на них расшарены ресурсы с русскими именами, а на остальных - нет ... и т.п.
3. У проекта jcifs есть mail list. По крайней мере года полтора назад он был вполне живой и народ там активно помогал с устранением ошибок в jcifs.
4. Еще можно попробовать подключать другие версии этой библиотеки.
5. Возможно, ошибку можно будет обойти при помощи изменения настроек jcifs.


Цитата(Dweep @ 6.11.2005, 03:04)
Скиньте ссылку на ОpenSourse class

Во-первых это не класс, а пакет (продукт/проект/библиотека...) smile
Во-вторых, из того, что мне встречалось, jcifs был самым работоспособным.
В-третьих, увы, что-то сейчас не могу найти ссылок на другие проекты. smile

Автор: pvo 6.11.2005, 12:43
PS. Попробуй посмотреть http://sourceforge.net/search/?type_of_search=soft&exact=1&forum_id=0&group_id=0&atid=0&words=smb+java&Search=Search и http://java-source.net/open-source/network-clients

Автор: Dweep 6.11.2005, 13:47
Мой частично работающий код выглядит так:

Код

public static void updateP139() {
        for (int i=1; i<=255;i++) {
            try {
                SmbFile f = new SmbFile("file://10.45.6."+i+"/");
                SmbFile[] st = f.listFiles();
                for (int j=0;j<st.length;j++) {
                  System.out.println(""+st[j].getName());
                }
            }  catch (MalformedURLException e) {
                pr("MalformedURLException "+e);
            } catch (SmbException e) {
                pr("SnbException "+e);
            }
        }
    }


При i=18 выдает ошибку. Этот компьютер воткнутый в один со мной свич, то есть перебоев с сетью быть не должно. На нем открыты ресурсы через file i ftp, правда там установлено большое количество разного ПО(Apache 2.0, IIS 6.0, MySQL 4.1, VisNetic FtpServer, MS SQL 2000 и т.д.), еще стоит ограничение скорости на шары 500кбайт/с. Такую же ошибку выдает на еще как минимум одном компьютере.


Код

Transport1:   connect: state=0
SnbException jcifs.smb.SmbException: 
jcifs.util.transport.TransportException: Connection timeout
    at jcifs.util.transport.Transport.connect(Transport.java:175)
    at jcifs.smb.SmbTransport.connect(SmbTransport.java:271)
    at jcifs.smb.SmbTree.treeConnect(SmbTree.java:129)
    at jcifs.smb.SmbFile.connect(SmbFile.java:792)
    at jcifs.smb.SmbFile.connect0(SmbFile.java:762)
    at jcifs.smb.SmbFile.send(SmbFile.java:660)
    at jcifs.smb.SmbFile.doNetEnum(SmbFile.java:1624)
    at jcifs.smb.SmbFile.list(SmbFile.java:1547)
    at jcifs.smb.SmbFile.list(SmbFile.java:1441)
    at Searh.updateP139(Searh.java:223)
    at Pr5.<init>(Pr5.java:42)
    at Pr5.main(Pr5.java:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:494)
    at com.intellij.rt.execution.application.AppMain.main(Unknown Source)


Выскочило еще 2 проблемки, допустим на компе открыты


Код

clips/
maps/
music/
students photos/
net/
козаки/
picture/
Ocean_Elsy_Gloria_1/
Pricols/


Програма Выдает:

Код

Transport1:   connect: state=0
Transport1: run connected
Transport1: connected: state=3
net/
E$/
Pricols/
Є®§ ЄЁ/
IPC$/
D$/
maps/
picture/
G$/
F$/
music/
ADMIN$/
wwwroot$/
C$/
clips/


То есть итого 4 проблемы:

1. На некоторых компах програма не видит ресурсов вообще
2. проблема с русской кодировеой в шарах (козаки/ -----> Є®§ ЄЁ/) (вложеные папки видит нормально)
3. Некоторые папки не замечает: students photos/ и Ocean_Elsy_Gloria_1/
4. У меня вверсия jcifs_1.2.6, где можно скачать более продвинутую?



Автор: pvo 8.11.2005, 18:16
1. Русские имена папок начинаю показываться корректно при указании jcifs.encoding=Cp866.

2. Насчет длинных имен share - почитай http://www.google.ru/search?hl=ru&q=+jcifs+long+share+name+problem&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=
и http://search.gmane.org/search.php?group=gmane.network.samba.java&query=long+share+names. Я чуть посмотрел и обнаружил, что это well-known bug smile Причем исправить баг предполагается в версии 2.0 smile(
Для того, чтобы получать длинные имена share, нужно использовать RPC, который вроде как есть, но не интегрирован с jcifs. Если найдешь решение проблемы, свистни, плз - ибо тоже интересно.

3.С тем, что на некоторых компьютерах совсем не видит ресурсов не столкнулся. Может быть из-за того, что перед выполнением запроса вхожу в домен.
4. Насчет версии - насколько я понял, 1.2.6 - последняя версия, а public cvs or svn нет smile

Автор: Guest 12.11.2005, 02:33
С длинными именами я боролся таким способом:
smbF[] - масив полученых шар, с фильтром пропускать только директории.
ShellFolder - import sun.awt.shell.ShellFolder;
file[] - новый масив порлученых шар с длинными а также рускими именами.

Код

if (smbF.length!=0) {
                    String st = smbF[0].getName();
                    File f1 = new File(host+st);
                    ShellFolder f = ShellFolder.getShellFolder(f1);
                    f = (ShellFolder)f.getParentFile();
                    File file[] = f.listFiles();
                }


Очевидно, что если на компе нет папок с короткими именами то так сделать не получится.

Если все папки на руском, то проблема с кодировкой остается. Я не придумал ничего лучшего чем менять
"©жгЄҐ­Јий§екдлў Їа®«¤¦нпзб¬ЁвмЎо‰–“Љ…?ѓ?™‡•љ”›‚Ђ??Ћ‹„†?џ—‘Њ?’њ?ћ" на
"йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ"
Как указать кодировку, куда ее вписывать?

Автор: Lеstat 10.1.2006, 14:25
а вот у меня проблемка
на компе открыта папка Mus

если я пишу
Код

    private static void ShowDir()
    {
        try
        {
            SmbFile f = new SmbFile("smb://192.168.0.1/mus/");
            SmbFile[] st = f.listFiles();
            for(int i=0;i<st.length;i++)
            {
                System.out.println(st[i].getName());
            }
        }
        catch (MalformedURLException e) {System.out.println("MalformedURLException " + e);}
        catch (SmbException e) {System.out.println("SnbException " + e);}
    }

все нормально... получаю папки и файлы в папке mus,

но если я пытаюсь получить что в корне лежит
Код

    private static void ShowDir()
    {
        try
        {
            SmbFile f = new SmbFile("smb://192.168.0.1/");
            SmbFile[] st = f.listFiles();
            for(int i=0;i<st.length;i++)
            {
                System.out.println(st[i].getName());
            }
        }
        catch (MalformedURLException e) {System.out.println("MalformedURLException " + e);}
        catch (SmbException e) {System.out.println("SnbException " + e);}
    }

то SnbException jcifs.smb.SmbException: 5 выдает
не пойму в чем проблема

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)