如何将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).
四、现有代码无法运行的常见修复点
如果你的代码没正常输出,检查以下几点:
- 依赖未正确引入:确认rebar.config里的依赖配置正确,且执行了
rebar3 compile,编译日志没有报错 - 连接参数错误:
server字段必须是ejabberd配置中hosts的值,不是IP;端口要确保是5222(或你自定义的客户端端口),且Ubuntu防火墙开放该端口 - 缺少XMPP流程初始化:XMPP需要完成握手、认证、流开启等步骤,不能直接发消息,必须用库封装的方法(比如
escalus_client:start/1或xmpp:connect/2)完成这些流程 - 消息接收逻辑缺失:XMPP是异步通信,必须用
receive块等待消息,或者注册消息回调函数 - ejabberd配置限制:确保ejabberd的
listen配置中,5222端口的module是ejabberd_c2s,且access设置允许外部客户端连接(比如access: c2s)
内容的提问来源于stack exchange,提问作者Mohammed Rifaz
相关产品推荐
相关产品推荐

