2010-09-03 15 views
5

estoy tratando de codificar un pequeño cliente XMPP gtalk en java. Sé que hay muchas bibliotecas que lo ayudan, pero el RFC es tan fácil de entender que decido escribir un cliente por mi cuenta. sé que el servidor gtalk es talk.google.com:5222 pero cuando intento este pequeño programa me da este resultado:¿Cómo conectarse a gtalk en java?

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> 

También probé para conectar la ubicación especificada pero no funciona. Aquí está mi código en 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()); 
     } 

    } 
} 

¿Cómo me puedo conectar al servidor gtalk?

Respuesta

2

XMPP no es un protocolo trivial para implementar, y no creo que llegue muy lejos al enviar cadenas XML hechas a mano al servidor.

Recomendaría estudiar algún código fuente existente.

Spark y OpenFire son un ejemplo de una buena implementación de cliente y servidor XMPP open source en java.

Puede intentar ejecutar OpenFire localmente en un depurador (o con el registro detallado activado) para que pueda hacerse una idea de lo que está haciendo con sus paquetes.

+2

Spark es un cliente web y Openfire un servidor XMPP, lo que necesita (para un cliente) es la API de Smack. – Guillaume

+0

@Guillaume - [SparkWeb] (http://www.igniterealtime.org/projects/sparkweb/index.jsp) es un cliente web. [Spark] (http://www.igniterealtime.org/projects/spark/index.jsp) es un cliente de escritorio. – Seth

+1

Enlace directo para Smack está aquí http://www.igniterealtime.org/projects/smack/ –

0

Aunque no está directamente relacionado, es posible que necesite un servidor para probar y otro para el que pueda ver la fuente. Sugiero que mires lo que están haciendo los chicos de Vysper http://mina.apache.org/vysper/

0

Tienes varios problemas con tu código, sin contar el estilo de no usar un DOM antes del envío (lo cual es una práctica recomendada en el mundo XMPP).

  1. Debe conectarse a "talk.l.google.com". Vea los resultados de "dig + short _xmpp-client._tcp.gmail.com SRV" en la línea de comando para averiguar a qué servidores conectarse.
  2. En su prólogo XML, está escapando dos veces de las comillas simples, lo que en realidad enviará una barra diagonal inversa.
  3. El atributo para en su secuencia: la secuencia debe ser "gmail.com", sin el número de puerto.

Dicho todo esto, voy a poner en segundo lugar los otros carteles con una súplica para que no inicie otra biblioteca cliente Java, sino que lance una existente.

0

¿Por qué está escribiendo una versión XML antes de escribir la estrofa de la secuencia? El servidor espera una secuencia de formato definido y no una estructura XML. Quite esta línea

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

, entonces funcionará con seguridad.

Cuestiones relacionadas