Java-соединение с Jabber только с сокетами - PullRequest
0 голосов
/ 19 марта 2012

Какой тип потока я могу использовать для отправки сообщения запроса через сокет tcp на jabber .

Я пишу строку в формате xml.

Я не могу использовать любые библиотеки. Это должны быть чистые Java-сокеты .

Ниже приведен код, который я использовал. Но ответ на второй XML-запрос: null

 try {


            Socket s = new Socket("195.211.49.6", 5222);

            PrintWriter out = new PrintWriter(s.getOutputStream());
            out.println("<stream:stream to='nimbuzz.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>");

            out.flush();

            BufferedReader reader = new BufferedReader(new InputStreamReader(s
                    .getInputStream()));

            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);

            }

            out.println("<iq type='set' xml:lang='en' id='terms' to='nimbuzz.com'><query xmlns='jabber:iq:auth'><username>username</username><password>password</password><resource>resource</resource></query></iq>");
           out.flush();
            reader = new BufferedReader(new InputStreamReader(s
                    .getInputStream()));
            while ((line = reader.readLine()) != null) {
                System.out.println(line);

            }
            s.close();

        }  catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println(e.getLocalizedMessage());
        }

это то, что я реализовал в C #, он тоже работает довольно быстро.

 Socket m_socWorker;
                try
            {
                m_socWorker = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
                string ipString = "195.211.49.6";
                string str2 = "5222";
                int port = Convert.ToInt16(str2, 10);
                IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ipString), port);
                m_socWorker.Connect(remoteEP);

            string page=string.Empty, page1=string.Empty, page2=string.Empty;
            string s = "<stream:stream to='nimbuzz.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>";
                    byte[] bytes = Encoding.UTF8.GetBytes(s);
                    byte[] buffer = new byte[0x4b38];
                     m_socWorker.Send(bytes, bytes.Length, SocketFlags.None);
                    int count = 0;
                    count =  m_socWorker.Receive(buffer, buffer.Length, SocketFlags.None);
                     page =  page + Encoding.ASCII.GetString(buffer, 0, count);
                    byte[] buffer3 = new byte[0x4b38];
                    int num2 = 0;
                    num2 =  m_socWorker.Receive(buffer3, buffer3.Length, SocketFlags.None);
                     page1 =  page1 + Encoding.ASCII.GetString(buffer3, 0, num2);
                     if (page1.Replace("\"", "'").IndexOf("<stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>PLAIN</mechanism><mechanism>PLAIN TEXT</mechanism></mechanisms><register xmlns='http://jabber.org/features/iq-register'/></stream:features>", 0) != 0)
                     {
                         string str3 = "<iq type='set' xml:lang='en' id='Nimbuzz_Login' to='nimbuzz.com'><query xmlns='jabber:iq:auth'><username>username</username><password>password</password><resource>resource</resource></query></iq>";
                         byte[] buffer4 = new byte[0x30d40];
                         buffer4 = Encoding.UTF8.GetBytes(str3);
                         byte[] buffer5 = new byte[0x4b38];
                         m_socWorker.Send(buffer4, buffer4.Length, SocketFlags.None);
                         int num3 = 0;
                         num3 = m_socWorker.Receive(buffer5, buffer5.Length, SocketFlags.None);
                         page2 = Encoding.ASCII.GetString(buffer5, 0, num3);
                         string str4 = page2.Replace("\"", "'");
                         int num4 = 1;
                     }
            }
                catch (SocketException)
                {

                }
                catch (Exception)
                {
                }

1 Ответ

2 голосов
/ 19 марта 2012

Вы присоединяете 2-й BufferedReader (InputStreamReader (...)) к вашему потоку.

Вероятно, ответ на ваш второй запрос расходуется и теряется в первом буфере. Попробуйте повторно использовать начальный BufferedReader reader;, чтобы прочитать ответ на второе сообщение. Помните, что XMPP - это один двунаправленный поток, поэтому все взаимодействие происходит через один и тот же сокет в течение всего времени жизни вашего соединения.

- РЕДАКТИРОВАТЬ -

В: Каким должен быть второй запрос?

A: Редактирование вашего кода, чтобы дать вам отправную точку (не проверено на компиляцию, просто чтобы дать вам представление о том, как действовать):

private static final int BUFFER_SIZE = 1024;

// Encapsulate the read process
private String readData(Reader reader) throws IOException {
    StringBuilder result = new StringBuilder(); 
    char[] buffer = new char[BUFFER_SIZE];  // [note1]
    while (reader.ready()) { // [note2]
        int charsRead = reader.read(buffer,0,BUFFER_SIZE-1));
        if (charsRead > 0) {
            result.append(buffer,0,charsRead);
        }
    }
    return result.toString();
}

public void readStuff() { 
    try {
        Socket s = new Socket("195.211.49.6", 5222);

        PrintWriter out = new PrintWriter(s.getOutputStream());
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream()));
        out.println("<stream:stream to='nimbuzz.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>");
        out.flush();

        // Read out the data and print it to the console
        System.out.println(readData(bufferedReader));

        // Second request over the same socket
        out.println("<iq type='set' xml:lang='en' id='terms' to='nimbuzz.com'><query xmlns='jabber:iq:auth'><username>username</username><password>password</password><resource>resource</resource></query></iq>");
        out.flush();

        // Read out the answer for the second result
        System.out.println(readData(bufferedReader));


    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
         e.printStackTrace();
    } catch (Exception e) {
        System.out.println(e.getLocalizedMessage());
    }
}

Примечания:

[1] Этот буфер можно повторно использовать в разных запросах. Нет никакой необходимости воссоздавать его каждый раз, когда вызывается этот метод. Я оставил это там, чтобы дать вам некоторую привязку с вашим кодом C #.

[2] Вы проверяете EOF в своем коде. Это потенциально не произойдет в XMPP-соединении. Лучше читать символы, доступные в потоке, пока их больше нет. Поэтому я проверяю read.ready () вместо reader.read (...)> - 1 См. Этот вопрос для дальнейшего обсуждения EOF: Как распознать EOF в сокетах Java?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...