【问题标题】:Send message using sockets and XMPP使用套接字和 XMPP 发送消息
【发布时间】:2019-09-06 19:36:52
【问题描述】:

我正在学习 Java 套接字,并想尝试仅使用套接字来实现 XMPP 库,但我不明白该怎么做。我读了 RFC,但什么都不懂。

我想实现这些功能:

  • 发送/接收消息
  • 用户状态
  • 所有联系人

据我所知,这意味着我可以成功地继续向服务器发送消息,但是如何?

public static void main(String[] args) {
        String connect = "<?xml version='1.0'?> "
                + "<stream:stream "
                + "to='jabber.ru' version='1.0' "
                + "xmlns='jabber:client' "
                + "xmlns:stream='http://etherx.jabber.org/streams'>";

        String msg = "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\">";

        try {
            InetAddress address = InetAddress.getByName(host);
            Socket socket = new Socket(address, port);
            socket.setKeepAlive(true);

            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);
            bw.write(connect);
            bw.flush();
            System.out.println("Message sent to the server : " + connect);

            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String message = br.readLine();
            System.out.println("Message received from the server : " + message);

            bw.write(msg);
            bw.flush();
            System.out.println("Message sent to the server : " + msg);

            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);
            message = br.readLine();
            System.out.println("Message received from the server : " + message);

        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

注意:我不想使用任何库!所以 Smack 和其他人没有帮助。

【问题讨论】:

    标签: java sockets xmpp


    【解决方案1】:

    收到切换到TLS的确认后,需要将你的socket切换到TLS,不再使用明文。完成后,您可以简单地打开流并开始协商序列。服务器将发送您的流功能,您将能够进行身份验证。

    【讨论】:

    • 我已经成功获得 SASL 机制,接下来我想使用 选项进行身份验证,但服务器返回 null
    • 不确定你的意思。服务器不能“返回 null”,它在协议级别没有意义。
    • 即使您收到了 SASL 机制,您 “想要使用 &lt;iq&gt;”进行身份验证是什么意思?请查看Client-to-Server Examples,这可能会让您知道如何继续。
    • 更新了我上面的消息。在 我在 BufferedReader 中收到 null,而不是 预期
    • @Mellowas:您混淆了 SASL 和 TLS。无论如何,将您的服务器置于调试模式并查看日志。了解您在客户中做错了什么可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2010-10-28
    • 2016-09-30
    • 2011-05-31
    相关资源
    最近更新 更多