Реализация клиента xmpp в java - застрял на первом шаге - PullRequest
3 голосов
/ 28 января 2012

Я пытаюсь написать клиент 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();
        }
    }

}

Я могу отправить следующеена Google

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

и в ответ я ожидаю следующее

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

Но я ничего не получаю с сервера.

Снимок экрана от Wiresharkкак прикреплено.

Запросите вашу помощь и, пожалуйста, не говорите мне использовать уже существующие библиотеки xmpp, потому что я просто не хочу.

С уважением, Ману!

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

Ответы [ 2 ]

4 голосов
/ 28 января 2012

Проверьте SMACK , который обеспечивает хороший стек XMPP для Java. Он хорошо документирован и прост в использовании.

1 голос
/ 28 января 2012

Возможно, это вам поможет:

Клиент XMPP IM

Не спешите отклонять существующие библиотеки. Вы можете учиться у них, а затем реализовать свои собственные, если хотите. Вы хотите заново изобрести колесо, не глядя на колесо, используя других людей для описания колеса.

...