2012-01-27 44 views
3

我想寫一個xmpp客戶端來發送/接收來自gtalk的消息。在java中實現一個xmpp客戶端 - 卡在第一步

在我真正開始實施之前,我想開發一個原型,看看我是否能夠通過gtalk獲得消息。

我寫了下面的代碼,現在我開始加密連接之前,現在卡在我應該要求谷歌的部分。

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(); 
     } 
    } 

} 

我能夠發送以下,以谷歌

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

,並在回覆我期待以下

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

但我沒有得到任何東西從服務器返回。

wireshark的截圖如下。

請求你的幫助,請不要告訴我使用已經存在的xmpp庫,因爲我只是不想。

Regards, Manu!

Screenshot of WireShark

更新

已經找到了解決方案。工作代碼如下:

現在可以使用的代碼如下。

現在我會努力的TLS實現並取回這裏櫃面任何疑問:) :)

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(); 
     } 
    } 
} 

回答

4

檢查SMACK,它爲Java提供了一個很好的XMPP堆棧。它很好的記錄和易於使用。

+0

我編碼我自己的圖書館,所以不能使用你所建議的,但我肯定會指出它卡住時。謝謝 – Manav 2012-01-29 09:56:27

1

也許這將幫助你:

XMPP IM Client

不要如此快速地解散現有的圖書館。你可以向他們學習,然後實現你自己的願望。你想重新發明輪子而不用看輪子,用其他人來形容輪子給你。

+0

感謝您的回覆。我完全開放地提及其他圖書館,但我不想使用其中一個......你提到的那個似乎很棒,我現在一定會經歷它。同時,你認爲我的代碼中有什麼錯誤嗎?謝謝,馬努 – Manav 2012-01-27 20:25:14

+0

我唯一能想到的就是'readLine'需要一行以'LF','CR'或'CRLF'結尾的行。嘗試從您的'InputStream'逐個讀取字符作爲開始。 – Paul 2012-01-27 20:30:29

+0

但是這可能不是這種情況,因爲我看不到從wireshark的gtalk服務器回來的回覆....請參閱上面我的問題中的附加屏幕截圖。謝謝, – Manav 2012-01-27 20:36:55