Как подключиться к gtalk в Java? - PullRequest
       36

Как подключиться к gtalk в Java?

5 голосов
/ 03 сентября 2010

Я пытаюсь закодировать небольшой клиент XMPP gtalk в Java. Я знаю, что есть много библиотек, которые вам в этом помогают, но RFC настолько легко понять, что я решаю написать клиента самостоятельно. Я знаю, что gtalk-сервер - talk.google.com:5222, но когда я пробую эту маленькую программу, я получаю такой результат:

 HTTP/1.1 302 Found
Location: http://www.google.com/talk/
Content-Type: text/html
Content-Length: 151

<HTML><HEAD><TITLE>302 Moved</TITLE></HEAD><BODY><H1>302 Moved</H1>The document has moved <A HREF="http://www.google.com/talk/">here</A>.</BODY></HTML>

Я также пытался подключить указанное местоположение, но оно не работает. Вот мой код в Java:

    package fr.grosdim.myjabber;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSocketFactory;

/**
 * Hello world!
 * 
 */
public class App {
    public static void main(String[] args) {
        SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory
                .getDefault();
        try {


            Socket s = new Socket("talk.google.com", 5222);

            PrintWriter out = new PrintWriter(s.getOutputStream());
            out.println("<?xml version=\\'1.0\\' encoding=\\'utf-8\\' ?>");
            out
                    .println("<stream:stream to='talk.google.com:5222' "
                            + "xmlns='jabber:client'"
                            + " xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>");
            out.flush();

            BufferedReader reader = new BufferedReader(new InputStreamReader(s
                    .getInputStream()));

            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);

            }

            out.println("</stream>");
            s.close();

        } catch (SSLPeerUnverifiedException e) {
            System.out.println(" Erreur d'auth :" + e.getLocalizedMessage());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println(e.getLocalizedMessage());
        }

    }
}

Как я могу подключиться к серверу gtalk?

Ответы [ 4 ]

2 голосов
/ 03 сентября 2010

XMPP не является тривиальным протоколом для реализации, и я не думаю, что вы добьетесь большого успеха, отправив вручную созданные XML-строки на сервер.

Я бы порекомендовал изучить какой-то существующий источниккод.

Spark и OpenFire - один из примеров хорошей клиентской и серверной реализации XMPP с открытым исходным кодом в Java.

Вы можете попробовать запустить OpenFire локально в отладчике (или с включенным подробным ведением журнала), чтобы вы могли понять, что он делает с вашими пакетами.

0 голосов
/ 15 февраля 2012

Почему вы пишете XML-версию перед написанием потока? Сервер ожидает поток определенного формата, а не структуру XML. Удалить эту строку

"out.println("< ? xml version=\\'1.0\\' encoding=\\'utf-8\\' ?>")" 

тогда будет работать наверняка.

0 голосов
/ 13 сентября 2010

У вас есть несколько проблем с вашим кодом, не считая стилистического отказа от использования DOM перед отправкой (что является лучшей практикой в ​​мире XMPP).

  1. Вам необходимо подключиться к "talk.l.google.com».См. Результаты «dig + short _xmpp-client._tcp.gmail.com SRV» в командной строке, чтобы узнать, к каким серверам подключаться.
  2. В вашем прологе XML вы дважды избегаете одиночногокавычки, которые фактически отправят обратную косую черту.
  3. Атрибут to в вашем потоке: stream должен быть "gmail.com", без номера порта.

Все это сказаноЯ оставлю другие постеры с призывом не запускать другую клиентскую библиотеку Java, а добавить уже существующую.

0 голосов
/ 04 сентября 2010

Хотя это и не связано напрямую, вам может понадобиться сервер для тестирования и тот, для которого вы можете увидеть источник. Предлагаю вам посмотреть, что делают ребята из Vysper http://mina.apache.org/vysper/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...