如何将Windows中的Erlang连接至Ubuntu中的Ejabberd?
解决Ubuntu Ejabberd与Windows Erlang连接及Exmpp包问题
一、搞定Windows Erlang环境的Exmpp依赖
Windows下没有现成的Exmpp预编译包,得自己编译或用rebar3管理依赖:
- 先确保Windows环境装了Erlang/OTP(版本建议和Ejabberd使用的Erlang版本尽量接近,避免兼容性问题)、Git和编译工具(比如MinGW或MSVC)
- 用rebar3创建Erlang项目,在
rebar.config里添加Exmpp依赖:{deps, [ {exmpp, {git, "https://github.com/processone/exmpp.git", {tag, "1.1.0"}}} ]}. - 打开命令行进入项目目录,执行
rebar3 get-deps拉取依赖,再执行rebar3 compile编译Exmpp - 如果编译报错,检查编译工具是否配置正确,比如MinGW的路径要加到系统环境变量里
二、连接Ejabberd的步骤(基于Exmpp)
- 初始化Exmpp:在Erlang代码里先初始化Exmpp库
application:ensure_all_started(exmpp), {ok, Session} = exmpp_session:start(), - 创建JID和认证:用Ejabberd上已注册的账号(比如
testuser@your-ejabberd-domain)创建JID,设置认证信息JID = exmpp_jid:make("testuser", "your-ejabberd-ip-or-domain", "windows-client"), exmpp_session:auth(Session, JID, "your-password"), - 连接服务器:指定Ejabberd的IP和默认XMPP端口5222,发起连接
{ok, _StreamId} = exmpp_session:connect_TCP(Session, "your-ejabberd-ip", 5222), - 绑定资源并开启会话:连接成功后绑定客户端资源,开启会话
exmpp_session:bind(Session, exmpp_jid:resource(JID)), exmpp_session:session(Session), - 测试发送消息:发一条消息验证连接是否正常
Message = exmpp_message:normal("Hello from Windows Erlang client!"), exmpp_session:send_packet(Session, exmpp_stanza:set_recipient(Message, exmpp_jid:make("anotheruser@your-ejabberd-domain"))), - 处理接收的消息:注册回调函数处理服务器推送的消息
回调函数示例:exmpp_session:register_callback(Session, message, fun handle_message/3),handle_message(_Session, _MessageId, Message) -> io:format("Received message: ~p~n", [exmpp_message:get_body(Message)]).
注意事项
- 确保Ubuntu的Ejabberd允许外部连接:检查
ejabberd.yml里的listen配置,5222端口要绑定到0.0.0.0而非127.0.0.1 - 关闭Ubuntu防火墙或开放5222端口,避免Windows客户端无法连接
- 如果用TLS加密连接,把连接方式改成
connect_TLS,端口用5223,同时确保Ejabberd配置了TLS证书
内容的提问来源于stack exchange,提问作者Mohammed Rifaz
相关产品推荐
相关产品推荐

