[J2ME] Łączenie z serwerem XMPP.

0

Witam. Próbuję stworzyć prostego klienta Jabbera. Doszedłem do wniosku, że na pierwszy ogień powinno pójść połączenie z serwerem i niestety już tutaj pojawiają się problemy.
Korzystam z biblioteki BEEP(http://sourceforge.net/projects/beep/), według dokumentacji połączenie ustala się w taki sposób:

// Create a connection to the beep.org XMPP server.
 XMPPConnection con = new XMPPConnection("beep.org",3333,"service.com");

Niestety ten sposób nawet się nie kompiluje. Po moich przeróbkach wyskrobałem coś co się kompiluje:

SnippetProcessor xxx = null;
            textItem.setString("zalogowany");
            try {
                XMPPConnection polaczenie = new XMPPConnection("beep.org", 3333, "service.com", xxx, 0);
            } catch(XMPPException exc) {
                textItem.setString("Nie zalogowany");
            }

Dalej nic z tego, połączenie rzuca wyjątek i napis = nie zalogowany. Wie ktoś w czym problem?

0

Przejrzałem pobieżnie ich źródła i po pierwsze to zero w twoich przeróbkach oznacza WIFI_BLUETOOTH (0), jesteś pewien że twój emulator to wspiera? Testowanie to ja bym zaczął od NOWIFI_NOBLUETOOTH (3), wtedy połączenie nawiązywane jest przy pomocy:

connection = (StreamConnection)Connector.open("ssl://" + host + ":" + port);

Jakoś mnie to ssl nie przekonuje. Zawsze możesz przerobić ssl na socket i zobaczyć jak wygląda komunikacja między aplikacjami.

PS: Na komórce używam bombus-a i działa bezproblemowo może zobacz ich źródła.

0

A gdzie mogę znaleźć kody źródłowe tego bombusa. Ten sposób połączenia, który opisałeś wyżej, też niestety rzuca wyjątkiem....

0

Dałem sobie spokój z tymi bibliotekami i z XMPP. Przerzuciłem się na protokół gadu gadu. Teraz czytając to http://toxygen.net/libgadu/protocol/ staram się połączyć z appmsg.gadu-gadu.pl w celu uzyskania odpowiedzi z adresem ip odpowiedniego serwera gg. Robię to tak:

try {
            StreamConnection connection = (StreamConnection) Connector.open("http://www.appmsg.gadu-gadu.pl");          
        } catch(IOException exc) {
            
        }

Wyjątek nie zostaje rzucony więc połączenie jest. Musze tam wysłać taki komunikat:

GET /appsvc/appmsg_ver8.asp?fmnumber=NUMER&fmt=FORMAT&lastmsg=WIADOMOŚĆ&version=WERSJA HTTP/1.1
Connection: Keep-Alive
Host: appmsg.gadu-gadu.pl

No to otwieram strumień, wysyłam, chcę otrzymać odpowiedź, otwieram strumień:

OutputStream os = connection.openOutputStream();
            os.write("GET /appsvc/appmsg_ver8.asp?fmnumber=4910234&fmt=1&lastmsg=1&version=8.0.0.7669 HTTP/1.1".getBytes());
            InputStream is = connection.openInputStream();

I tutaj rzuca wyjątkiem i nic dalej nie mogę zrobić. Pewnie robię coś źle. Byłbym wdzięczny za podpowiedź z przykładem jak poprawnie wysyłać i odbierać pakiety w javie.

0

O nie tylko nie gadu.

Dobra to robisz tak: zapominasz o gadu :)
Ściągasz source.zip z http://sourceforge.net/projects/kvmjab/
Po dodaniu źródeł do twojego projektu wywalasz: seConnector.java, KvmJab.java, Java2se.java, Pager.java
W meConnector.java wywalasz 60 linie

    StringBuffer connectorStringBuffer = new StringBuffer( "socket://" );
    connectorStringBuffer.append( hostname );
    connectorStringBuffer.append( ":" );
    connectorStringBuffer.append( port );
    //connectorStringBuffer.append( "/" );

Natomiast w Java2me.java ustawiasz gdzie i jako kto ma się łączyć

Myślę, że dalej sobie poradzisz. Przetestowałem to u siebie (bez szyfrowania). Działa.

0

Czy w netbeans można jakoś dodać te źródła za jednym zamachem, czy trzeba dodawać ręcznie?

0

Pytasz poważnie?

Możesz sobie po prostu skopiować katalog com z source.zip do katalogu src twojego projektu, albo jeszcze lepiej zrobić nowy projekt i tam władować ten com, a do twojego projekty dodać tylko jar-a.

Poza tym pierwsza pozycja we właściwościach projektu to Sources i tam masz Add Folder

0

Nie, po prostu myślałem, ze trzeba to zrobić w jakiś inny sposób. Dołączyłem jara do mojego projektu i zaczynam testy. Dzięki za pomoc. Jak będę miał jakieś problemy to odezwę się :).

A działa u Ciebie wysyłanie wiadomości, bo u mnie coś nie bardzo, robię wszystko na bazie tego pliku java2me i dokumentacji, połączenie z serwerem aqq.eu i logowanie nie rzucają żadnych wyjątków, dioda połączenie internetowego na emulatorze się świeci ale wiadomości wysłać nie mogę dostaję nullPointerException.

0

możesz mi przesłać ten twój testowy program?

0

U mnie wszystko działało zarówno wysyłanie jak i odbieranie, ale testowałem to tylko na połączeniu NIE szyfrowanym. Napisz konkretnie z czym masz problem, bo ja sam program już dawno wywaliłem. Ostatecznie jak będę miał chwile mogę Ci coś wyklikać bo to ograniczało się gdzieś do 10 linijek kodu.

0

A w którym miejscu ustawiasz typ połączenia. Ja korzystam ze zmodyfikowanej klasy java2me(dodałem tam kilka pól, usunąłem funkcję main()) o nazwie XMPP ustawiłem w niej:

private static final String SERVER_NAME = "aqq.eu";
private static final int SERVER_PORT = 5222;
private static final String USERNAME = "[email protected]";
private static final String PASSWORD = "kleszczu12";
private static final String TEST_MESSAGE_RECIPIENT = "[email protected]";
private static final String TEST_MESSAGE_BODY = "Test message";

Później aby się połączyć z serwerem tworzę sobie nowe pole prywatne
XMPP Client;

później w metodzie startApp(); powołuje je do życia:
Client = new XMPP();

później, żeby się zalogować:
Client.beginConversation();

a żeby wysłać wiadomość:

try {
                    Client.sendMessage();
                } catch(IOException e) {
                    e.printStackTrace();
                }

No i nie wysyła wiadomości. Byłbym wdzięczny za jakiś przykładowy kod. Domyślam się, że muszę czegoś tam jeszcze użyć ale nie za bardzo wiem czego.

0

Posłałem Ci na maila działający przykład. Zwykły wyklikany w netbeans-ie midlet z 3 metodami napisanymi ręcznie. Przejrzyj uruchom i stawiam że dalej już sobie poradzisz. Klasa Java2me jest zbędna i można ją wyrzucić.

0

na jakim serwerze to testowałeś bo mi na aqq.eu i jid.pl nie działa ;/

0

tak wygląda mój kod:

private void connect() {
        new Thread(new Runnable() {

            public void run() {

                if (jabber != null) {             
                    return;
                }

                try {
                    jabber = new JabberStream(new meConnector("jid.pl", 5222));
                    jabber.setJabberListener(new JabberListener() {

                        public void beginConversation() {
                            try {
                                Login login = new Login("[email protected]", "sromica", null);
                                jabber.send(login);
       
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }

                        public void blockArrived(JabberDataBlock data) {
                            try {
                                if (data instanceof Iq) {
                                    String result = (String) data.getAttribute("type");
                                    if (result.equals("result")) {
                                        jabber.send(new Presence());
                                    }
                                }
                                if (data instanceof Message) {
                                    Message message = (Message) data;
                                    recive(message.getAttribute("from"), message.getBody());
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }

                        public void connectionTerminated(Exception e) {
                        }
                    });
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
     
            }
        }).start();
    }

    private void send() {
        try {
            if (jabber == null) {
                return;
            }
            String to = getToField().getString();
            String body = getBodyField().getString();
            jabber.send(new Message(to, body));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public void recive(String from, String body) {
        getToField().setString(from);
        getBodyField().setString(body);
    }
0

Testowałem na serwerze działającym u mnie lokalnie (openfire). Wszystko było ok. Spróbuj ustawić jakieś resource np:

new Login("[email protected]", "sromica", "home");
0

Resource "home" nic nie pomógł, próbowałem tez bezpośrednio po linijce:

jabber.send(login);

dodać:

jabber.send(new Presence());

bo widzę, że na liście moich kontaktów użytkownik test66669 cały czas jest niedostępny.

Może jest coś nie tak z połączeniem na emulatorze, lub mam zablokowane porty na routerze, czy jest to możliwe?

0

Wszystko jest możliwe no ale tak na logike to skoro łączysz się zwykłym klientem to raczej problem nie leży w portach :)
Daj login jako test66669 bez końcówki i rozumiem że w klasie meConnector usunąłeś linijkę: connectorStringBuffer.append( "/" ); czyli to co wysyłałem.

0

W końcu :). Tak chodziło o tą końcówkę. Teraz działa, łączy się, loguje, wysyła i odbiera wiadomość :). Super!!! Dzięki wielkie za pomoc.

I takie pytanie z boku czy przy pomocy tej biblioteki mogę w jakiś łatwy sposób zrobić takie rzeczy jak wysyłanie/pobieranie listy kontaktów na serwer, ustawianie i z czytywanie opisów, bo po przeglądnięci javadoc nie widzę odpowiedzialnych za to klas czy będę musiał pobawić się komunikatami XMPP?

1 użytkowników online, w tym zalogowanych: 0, gości: 1