2012-01-27 2 views
3

J'essaye d'écrire un client xmpp pour envoyer/recevoir des messages de gtalk. Avant de commencer l'implémentation, j'ai pensé à développer un prototype pour voir si je pouvais passer un message à gtalk.Implémentation d'un client xmpp dans java - coincé dans la première étape

J'ai écrit le code suivant et suis maintenant coincé dans la partie où je suis supposé demander google avant de commencer une connexion cryptée.

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 
public class XmppConnect { 
static String initiate_conn="<?xml version=\"1.0\"?>\n\r<stream:stream to=\"google.com\"\n\rversion=\"1.0\"\n\rxmlns=\"jabber:client\"\n\rxmlns:stream=\"http://etherx.jabber.org/streams\">\n"; 
static String start_tls="<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>"; 
public static void main(String [] args) 
    { 
     try { 
      Socket connection = new Socket("talk.google.com", 5222); 
      DataInputStream input = new DataInputStream(connection.getInputStream()); 
      BufferedReader d = new BufferedReader(new InputStreamReader(input)); 
      OutputStream to_server = null; 
      String responseLine; 
      to_server = connection.getOutputStream(); 
      to_server.write(initiate_conn.getBytes()); 
      responseLine = d.readLine();  
      System.out.println("Server: " + responseLine); 
      to_server.write(start_tls.getBytes()); 
      responseLine = d.readLine();  
      System.out.println("Server: " + responseLine); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

Je suis en mesure d'envoyer les documents suivants à Google

<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/> 

et en réponse je me attends à ce qui suit

<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/> 

Mais je ne reçois rien à partir du serveur.

La capture d'écran de wireshark est comme ci-joint.

Demandez votre aide et s'il vous plaît ne me dites pas d'utiliser les bibliothèques xmpp déjà existantes parce que je ne veux pas.

Cordialement, Manu!

Screenshot of WireShark

Mise à jour

ont trouvé la solution. Le code de travail est comme ci-dessous:

Le code qui fonctionne pour l'instant est comme ci-dessous.

Maintenant, je vais travailler sur la mise en œuvre TLS et de revenir ici Encas de doute :) :)

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 
public class XmppConnect { 
static String initiate_conn="<stream:stream to=\"gmail.com\" version=\"1.0\" xmlns=\"jabber:client\" xmlns:stream=\"http://etherx.jabber.org/streams\">"; 
static String start_tls="<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>"; 
public static void main(String [] args) 
    { 
     try { 
      Socket connection = new Socket("talk.google.com", 5222); 
      DataInputStream input = new DataInputStream(connection.getInputStream()); 
      BufferedReader d = new BufferedReader(new InputStreamReader(input,"UTF-8")); 
      BufferedWriter to_server = new BufferedWriter(
        new OutputStreamWriter(connection.getOutputStream(),"UTF-8") 
        ); 
      String responseLine=""; 
      to_server.write(initiate_conn); 
      to_server.flush(); 
      int in; 
      while(!(responseLine.contains("</stream:features>"))) 
      { 
       responseLine += (char)d.read(); 
      } 
      System.out.println("Server: " + responseLine); 
      to_server.write(start_tls); 
      to_server.flush(); 
      responseLine=""; 
      while(!(responseLine.contains("<proceed xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>"))) 
       responseLine += (char)d.read(); 
      System.out.println("Server: " + responseLine); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Répondre

4

Vérifiez le SMACK qui fournit une belle pile XMPP pour Java. C'est bien documenté et facile à utiliser.

+0

Je suis en train de coder ma propre bibliothèque donc je ne peux pas utiliser ce que vous avez suggéré, mais je vais certainement me référer à elle quand elle est bloquée. Merci – Manav

1

Peut-être que cela vous aidera:

XMPP IM Client

Ne soyez pas si rapide de rejeter les bibliothèques existantes. Vous pouvez apprendre d'eux et ensuite mettre en œuvre votre propre si vous le désirez. Vous voulez réinventer la roue sans regarder une roue, en utilisant d'autres personnes pour vous décrire une roue.

+0

Merci pour votre réponse. Je suis totalement ouvert à la référence d'autres bibliothèques, mais je ne veux pas en utiliser une ... Celle que vous mentionnez semble être géniale et je vais certainement m'en occuper maintenant. Pendant ce temps, pensez-vous que quelque chose ne va pas dans mon code? Merci, Manu – Manav

+0

La seule chose que je peux penser est que readLine attend une ligne terminée par 'LF',' CR', ou 'CRLF'. Essayez de lire les caractères de votre 'InputStream' un par un comme un début. – Paul

+0

Mais ce n'est probablement pas le cas parce que je ne peux pas voir une réponse revenant du serveur gtalk dans le wireshark .... S'il vous plaît se référer à la capture d'écran ci-joint dans ma question ci-dessus. Merci, – Manav

Questions connexes