我想寫一個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!
更新
已經找到了解決方案。工作代碼如下:
現在可以使用的代碼如下。
現在我會努力的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();
}
}
}
我編碼我自己的圖書館,所以不能使用你所建議的,但我肯定會指出它卡住時。謝謝 – Manav 2012-01-29 09:56:27