You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Windows Erlang项目连接至Ubuntu的ejabberd服务器?

Erlang项目连接Ejabberd的完整方案

一、推荐的Erlang XMPP连接库

你可以根据需求选择以下两个常用库:

  • escalus:ejabberd官方维护的客户端/测试库,封装了XMPP握手、认证、消息发送等常用操作,上手快
  • xmpp:ProcessOne出品的底层XMPP协议实现库,适合需要自定义XMPP流程的场景

二、依赖获取方式(rebar3)

在项目根目录的rebar.config里添加对应依赖,然后执行rebar3 get-deps && rebar3 compile拉取并编译:

用escalus的依赖配置

{deps, [
    {escalus, ".*", {git, "https://github.com/processone/escalus.git", {tag, "1.1.0"}}}
]}.

用xmpp的依赖配置

{deps, [
    {xmpp, ".*", {git, "https://github.com/processone/xmpp.git", {tag, "1.6.0"}}}
]}.

三、可运行的连接代码示例

示例1:使用escalus(推荐新手)

包含完整的连接、发消息、收消息流程:

-module(hello_xmpp).
-export([connect/0]).

connect() ->
    % 替换成你的ejabberd实际配置
    ConnConfig = [
        {host, "192.168.x.x"},       % Ubuntu服务器IP
        {port, 5222},                % ejabberd默认客户端端口(确保对外开放)
        {username, "test_user"},     % 已在ejabberd创建的用户名
        {password, "test_pass"},     % 用户密码
        {server, "your_xmpp_domain"} % ejabberd配置中hosts字段设置的域名(比如localhost)
    ],

    % 初始化escalus并建立连接
    escalus:start(),
    {ok, Client} = escalus_client:start(ConnConfig),

    % 发送在线状态
    escalus_client:send(Client, escalus_stanza:presence(<<"available">>)),

    % 给自己发一条测试消息
    TestMsg = escalus_stanza:chat_to(Client, <<"Hello from Erlang XMPP Client!">>),
    escalus_client:send(Client, TestMsg),

    % 等待接收消息并打印
    receive
        {stanza, Client, Stanza} ->
            io:format("收到消息: ~p~n", [Stanza])
    after 5000 ->
        io:format("5秒内未收到消息~n")
    end,

    % 断开连接并清理
    escalus_client:stop(Client),
    escalus:stop().

示例2:使用xmpp(底层控制)

适合需要灵活控制XMPP流程的场景:

-module(hello_xmpp).
-export([connect/0]).

connect() ->
    % 初始化XMPP会话
    {ok, Session} = xmpp:start(),

    % 连接参数,替换成你的实际配置
    ConnParams = #{
        host => "192.168.x.x",
        port => 5222,
        username => <<"test_user">>,
        password => <<"test_pass">>,
        server => <<"your_xmpp_domain">>,
        auth => plain  % 认证方式,确保ejabberd允许plain认证
    },

    % 连接并完成认证
    {ok, Session1} = xmpp:connect(Session, ConnParams),

    % 发送在线状态
    Presence = xmpp:presence(<<"available">>),
    ok = xmpp:send(Session1, Presence),

    % 发送测试消息
    TestMsg = xmpp:chat_message(<<"test_user@your_xmpp_domain">>, <<"Hello from Erlang XMPP Client!">>),
    ok = xmpp:send(Session1, TestMsg),

    % 等待接收消息
    receive
        {xmpp, Session1, Stanza} ->
            io:format("收到消息: ~p~n", [xmpp:decode(Stanza)])
    after 5000 ->
        io:format("超时未收到消息~n")
    end,

    % 终止会话
    xmpp:stop(Session1).

四、现有代码无法运行的常见修复点

如果你的代码没正常输出,检查以下几点:

  1. 依赖未正确引入:确认rebar.config里的依赖配置正确,且执行了rebar3 compile,编译日志没有报错
  2. 连接参数错误:server字段必须是ejabberd配置中hosts的值,不是IP;端口要确保是5222(或你自定义的客户端端口),且Ubuntu防火墙开放该端口
  3. 缺少XMPP流程初始化:XMPP需要完成握手、认证、流开启等步骤,不能直接发消息,必须用库封装的方法(比如escalus_client:start/1或xmpp:connect/2)完成这些流程
  4. 消息接收逻辑缺失:XMPP是异步通信,必须用receive块等待消息,或者注册消息回调函数
  5. ejabberd配置限制:确保ejabberd的listen配置中,5222端口的module是ejabberd_c2s,且access设置允许外部客户端连接(比如access: c2s)

内容的提问来源于stack exchange,提问作者Mohammed Rifaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:52:48