3

我正在尝试编写一个 xmpp 客户端来发送/接收来自 gtalk 的消息。

在我真正开始实现之前,我想开发一个原型,看看我是否能够通过 gtalk 获得消息。

我编写了以下代码,现在卡在我应该在开始加密连接之前请求 google 的部分。

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 库,因为我只是不想这样做。

问候,马努!

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

2 回答 2

4

检查SMACK,它为 Java 提供了一个不错的 XMPP 堆栈。它有据可查且易于使用。

于 2012-01-28T10:49:30.253 回答
1

也许这会帮助你:

XMPP 即时通讯客户端

不要这么快就关闭现有的库。您可以向他们学习,然后根据需要实施您自己的。你想在不看轮子的情况下重新发明轮子,用别人给你描述一个轮子。

于 2012-01-27T20:20:54.180 回答