我正在尝试使用ejabberd服务器和smack库实现聊天信使,但很难整合所有的jar和smack的依赖.我正在使用android Studio.
我的build.gradle(模块):
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.example.nit.xmppclient"
minSdkVersion 18
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
compile "org.igniterealtime.smack:smack-android:4.1.0"
compile "org.igniterealtime.smack:smack-tcp:4.1.0"
compile "org.igniterealtime.smack:smack-android-extensions:4.1.0"
compile 'org.ogce:xpp3:1.1.6'
}
Run Code Online (Sandbox Code Playgroud)
首先我得到XMLpullparser错误然后我添加了xpp3.但是在我添加了xpp3后,我得到了
Error:Gradle: Execution failed for task ':app:preDexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/usr/lib/jvm/java-7-openjdk-amd64/bin/java'' finished with non-zero exit value 1
Run Code Online (Sandbox Code Playgroud)
的build.gradle(项目):
// Top-level build file where …Run Code Online (Sandbox Code Playgroud) 我正在运用随机库,C++ 11的新手.我写了以下最小程序:
#include <iostream>
#include <random>
using namespace std;
int main() {
default_random_engine eng;
uniform_real_distribution<double> urd(0, 1);
cout << "Uniform [0, 1): " << urd(eng);
}
Run Code Online (Sandbox Code Playgroud)
当我反复运行它时,它每次都给出相同的输出:
>a
Uniform [0, 1): 0.131538
>a
Uniform [0, 1): 0.131538
>a
Uniform [0, 1): 0.131538
Run Code Online (Sandbox Code Playgroud)
我希望程序在每次调用时都设置不同的种子,这样每次都会生成一个不同的随机数.我知道随机提供了一个名为seed_seq的工具,但我发现它的解释(在cplusplus.com上)完全模糊不清:
http://www.cplusplus.com/reference/random/seed_seq/
我很感激有关如何让程序在每次调用时生成新种子的建议:越简单就越好.
我的平台:
我已经使用XMPP在我的iOS和Android应用程序中集成了聊天系统.我在服务器端使用了ejabberd 2.聊天系统工作正常.我想在使用APNS和GCM的聊天中集成推送通知.如何向每条聊天消息发送推送通知?ejabberd 2有任何API或扩展可用于实现此功能吗?
帮助很高,
iphone xmpp ejabberd apple-push-notifications google-cloud-messaging
我有一些验证套接字:
defmodule Test.UserSocket do
use Phoenix.Socket
## Channels
channel "user:*", Test.RoomChannel
def connect(_params, socket) do
case Phoenix.Token.verify(socket, "user", _params["token"]) do
{:ok, uid} ->
{:ok, assign(socket, :user_id, uid)}
{:error, _} ->
:error
end
end
def id(_socket), do: "user:#{_socket.assigns.user_id}"
end
Run Code Online (Sandbox Code Playgroud)
并在连接套接字后命名为 user:#id
从文档中我可以发送断开连接事件
Test.Endpoint.broadcast("users_socket:" <> user.id, "disconnect", %{})
问题:如何将自定义事件发送到套接字user:#id,它应该像是对特定套接字的推送通知.
我试过Test.Endpoint.broadcast "user:1", "new:msg", %{user: "SYSTEM", body: "iex"}但它不起作用,因为我无法在套接字上听"new:msg".
我正在开发一个实时聊天应用程序.经过一段时间的搜索,我发现Ejabberd和Erlang是个不错的选择.
问题是Ejabberd没有提供我需要的所有功能.我需要一些自定义功能,如基于位置的匹配和匿名登录.
那么如何在Ejabberd之上开发自定义功能呢?为它写模块?或开发另一个独立的服务器应用程序(网络或其他类型的服务器应用程序)与它进行交互?
更新:另一个问题是我们添加自定义功能/功能的方式应该是可扩展的.
作为一名乘员/成员,我需要通过ejabberd-14.x了解房间内的所有"成员"
我关注了http://xmpp.org/extensions/xep-0045.html#getmemberlist
我被禁止(401)跟随stanze - 需要管理员权限
<iq from='crone1@shakespeare.lit/desktop'
id='member3'
to='coven@chat.shakespeare.lit'
type='get'>
<query xmlns='http://jabber.org/protocol/muc#admin'>
<item affiliation='member'/>
</query>
</iq>
Run Code Online (Sandbox Code Playgroud)
如果我改变
<query xmlns='http://jabber.org/protocol/muc#admin'>
Run Code Online (Sandbox Code Playgroud)
从admin到用户命名空间,然后我得到状态代码501 - 功能未实现
你知道我怎样才能让一个房间的成员成为一个占有者或成员?
我不是此用例的管理员/主持人.
XEP-0045确实说:
注意:服务应该也应该将成员列表返回给仅限会员的房间中的任何占用者; 也就是说,当房间中的成员请求成员列表时,它不应该生成错误.此功能可以帮助客户显示所有现有成员,即使其中一些成员不在会议室中,例如帮助成员确定是否应邀请其他用户.服务应该允许任何成员检索成员列表,即使还不是占用者.
我正在按照本指南将Ejabberd嵌入Phoenix应用程序(https://blog.process-one.net/embedding-ejabberd-into-an-elixir-phoenix-web-application/),我现在遇到错误它正在运行.
基本上,一切似乎工作正常,直到我导航到" http:// localhost:4000/ejabberd ",此时我收到以下错误:
[error] #PID <0.721.0>运行EjbrdTest.Endpoint终止服务器:localhost:4000(http)请求:GET/ejabberd**(退出)引发异常:**(Plug.Conn.AlreadySentError)响应是已发送(插件)lib/plug/conn.ex:428:Plug.Conn.resp/3(插件)lib/plug/conn.ex:415:Plug.Conn.send_resp/3(ejbrdTest)web/controllers/ejabberd_controller .ex:1:EjbrdTest.EjabberdController.phoenix_controller_pipeline/2(ejbrdTest)lib/phoenix/router.ex:265:EjbrdTest.Router.dispatch/2(ejbrdTest)web/router.ex:1:EjbrdTest.Router.do_call/2 (ejbrdTest)lib/ejbrdTest/endpoint.ex:1:EjbrdTest.Endpoint.phoenix_pipeline/1(ejbrdTest)lib/plug/debugger.ex:90:EjbrdTest.Endpoint."call(overridable 3)"/ 2(ejbrdTest)lib /phoenix/endpoint/render_errors.ex:34:EjbrdTest.Endpoint.call/2(插件)lib/plug/adapters/cowboy/handler.ex:15:Plug.Adapters.Cowboy.Handler.upgrade/4(cowboy)src/cowboy_protocol.erl:442 :: cowboy_protocol .execute/4
而不是用户列表,我在jumbotron中看到了这一点:
在线用户:<%=用户< - @users do%> <%=用户%>
<%end%>
我没有找到任何关于此的内容,任何想法?
谢谢.如果您需要更多信息,请告诉我.
我正在尝试ejabberd在我的电脑上安装,但我一直收到此错误:
Error running Post Install Script
The installation may not have completed correctly
Run Code Online (Sandbox Code Playgroud) 我正在使用ejabberd 15.09,并为服务器配置中的每个MUC启用了存档管理,如下所示:
mod_mam:
default: always
mod_muc:
## host: "conference.@HOST@"
access: muc
access_create: muc_create
access_persistent: muc_create
access_admin: muc_admin
default_room_options:
mam: true
persistent: true
public: true
Run Code Online (Sandbox Code Playgroud)
此外,Ejabberd管理面板上的检查显示,在每条消息发送到MUC后,存档表中的元素数量会增加,因此消息将被存档.这将验证是否为会话启用了存档.
要从MUC查询服务器的邮件存档,我发送此iq数据包:
<iq type='set' id='testid1'>
<query xmlns='urn:xmpp:mam:1'>
<x xmlns='jabber:x:data' type='submit'>
<field var='FORM_TYPE' type='hidden'>
<value>urn:xmpp:mam:1</value>
</field>
<field var='with'>
<value>testmyroomnow@conference.ip/</value>
</field>
</x>
</query>
</iq>
Run Code Online (Sandbox Code Playgroud)
从服务器收到的响应不包含任何消息.
<message from='user@ip' to='user@ip/Gajim'>
<fin xmlns='urn:xmpp:mam:0' complete='true'>
<set xmlns='http://jabber.org/protocol/rsm'>
<count>0</count>
</set>
</fin>
</message>
Run Code Online (Sandbox Code Playgroud)
此MUC已包含一些消息,但如上所述查询不返回任何消息.似乎xml节的格式不正确.发送会议JID的格式不正确或其他.
不知道该怎么办,因为我已经在使用最新版本的Ejabberd来支持MUC的存档.其他我在这里做的,我不知道如何从ejabberd服务器查询MUC存档.
我正在阅读http://xmpp.org/extensions/xep-0313.html以查询Ejabberd以查找使用特定用户存档的邮件.
这是我发送的xml:
<iq type='get' id='get_archive_user1'>
<query xmlns='urn:xmpp:mam:tmp'>
<with>user1@localhost</with>
<set xmlns='http://jabber.org/protocol/rsm'>
<max>20</max>
</set>
</query>
</iq>
Run Code Online (Sandbox Code Playgroud)
我正确收到了前20封邮件.要再次请求我添加标签:
<after>(id in element "Last" from last request)</after>
Run Code Online (Sandbox Code Playgroud)
这也很好.我需要的是接收最后20条消息,而不是前20条消息.我怎样才能做到这一点?