标签: smack

本课程使用AtomicBooleans.它是线程安全的吗?

我不喜欢用synchronized(this)锁定我的代码,所以我正在尝试使用AtomicBooleans.在代码片段中,XMPPConnectionIF.connect()与远程服务器建立套接字连接.请注意,变量_connecting仅在connect()方法中使用; 而_connected用于需要使用_xmppConn的其他所有方法.我的问题列在下面的代码段之后.

private final AtomicBoolean _connecting = new AtomicBoolean( false );
private final AtomicBoolean _connected = new AtomicBoolean( false ); 
private final AtomicBoolean _shuttingDown = new AtomicBoolean( false ); 
private XMPPConnection _xmppConn;
/**
 * @throws XMPPFault if failed to connect
 */
public void connect() 
{
    // 1) you can only connect once
    if( _connected.get() )
        return;

    // 2) if we're in the middle of completing a …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading xmpp smack

2
推荐指数
2
解决办法
4107
查看次数

使用X-FACEBOOK-PLATFORM SASL身份验证进行Facebook聊天身份验证

我正在使用X-FACEBOOK-PLATFORM SASL认证机制处理facebook聊天认证.

我正在形成用户和密码,如facebook开发人员论坛和stackoverflow问题中所述.

关键是如果我使用application_secret作为密码我可以登录,但根据stackoverflow问题(下面的链接),它应该是从旧的rest api方法auth.promoteSession生成的会话

我想使用旧的rest api方法,以避免在我们的桌面应用程序jar中分发application_secret.

所以问题是,你是如何设法使用auth.promoteSession登录的?

我已阅读以下帖子,这些帖子非常有帮助:

http://community.igniterealtime.org/message/205739#205739
XMPP与Java Asmack库支持X-FACEBOOK-PLATFORM

我正在使用来自igniterealtime帖子的SASLXFacebookPlatformMechanism.java类,它已经注册了correclty.

我有xmpp_login和offline_access permisions.我已经禁用了删除过时的Auth方法,所以我可以调用旧的rest api方法,在这种情况下:auth.promoteSession我也在使用客户端流认证到facebook.

因此,使用application_secret作为密码,我得到:

<stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-FACEBOOK-PLATFORM</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms></stream:features>
<challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">dmVyc2lvbj0xJm1ldGhvZD1hdXRoLnhtcHBfbG9naW4mbm9uY2U9NEIxRUQzNTA5MTQ5MDQxRTE4N0QyNTA0NTUzNjBDQjc=</challenge>
<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用auth.promoteSession返回的值,我得到:

<stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-FACEBOOK-PLATFORM</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms></stream:features>
<challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">dmVyc2lvbj0xJm1ldGhvZD1hdXRoLnhtcHBfbG9naW4mbm9uY2U9MzhFQkUxOTUxNENGRUU4ODc2NzRDREQ0RjhBMUQ0QjI=</challenge>
<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>
Run Code Online (Sandbox Code Playgroud)

java facebook chat xmpp smack

2
推荐指数
1
解决办法
4508
查看次数

在Smack中SASL和SASL PLAIN有什么区别?

我正在处理有关IM的事情.它涉及XMPP.我在Android上开发了一个应用程序,所以我使用了一个思科.我想登录google talk,在这里(链接如下)

https://developers.google.com/talk/open_communications

谷歌说只支持SASL PLAIN.但是当我在INTERNET上搜索时,很多人都认为google talk不支持SASL,所以需要这段代码:

    connectionConfig.setSASLAuthenticationEnabled(false);
Run Code Online (Sandbox Code Playgroud)

我很迷惑; 谁能告诉我哪个是正确的,或SASL和SASL PLAIN之间的区别?

android xmpp sasl smack asmack

2
推荐指数
1
解决办法
2006
查看次数

尝试从 aSmack Android 客户端连接到 XMPP 服务器时出现 ConnectionException

我已经尝试从我的 aSmack Android 客户端连接到我的(本地托管)Openfire XMPP 服务器几个小时了,但它仍然无法正常工作。

我得到一个org.jivesoftware.smack.SmackException$ConnectionException,就是这样。

代码:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    SmackAndroid.init(getApplicationContext());
    connect();
}

private boolean connect(){
    XMPPConnection connection = new XMPPTCPConnection(HOST);
    try{
        connection.connect();
        connection.login("user", "user");
    }catch (Exception e){
        e.printStackTrace();
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

服务器已启动并正在运行。

Host 是我的服务器名称,也尝试了我的主机名,尝试了不同的端口...还尝试从另一个线程启动 connect() 方法。尝试使用登录或匿名连接,但在此之前抛出异常,在行:connection.connect();

非常感谢任何帮助。

xmpp smack asmack

2
推荐指数
1
解决办法
7845
查看次数

在Smack 4.1中实例化ConnectionConfiguration

我正在我的Android应用程序中实现聊天功能.所以我已经安装了一个开放式服务器和Smack客户端库,现在我已经编写了一个代码来连接服务器,但是我收到的错误表明ConnectionConfiguration是一个抽象类.所以我不能实现.你能告诉我一下SMACK 4.1中ConnectionConfiguration的实例化吗?

android xmpp openfire smack

2
推荐指数
1
解决办法
2290
查看次数

启用流管理xmpp连接smack 4.1

我尝试通过这段代码启用流管理(XEP-0198)

XMPPTCPConnectionConfiguration connConfig = XMPPTCPConnectionConfiguration.builder().setHost(HOST)
            .setPort(PORT).setDebuggerEnabled(true).setSecurityMode(SecurityMode.disabled)
            .setUsernameAndPassword(USERNAME, PASSWORD).setServiceName(SERVICE).build();

    XMPPTCPConnectionconnection = new XMPPTCPConnection(connConfig);

        connection.setPacketReplyTimeout(TIME_OUT);
        connection.connect();
        connection.login();
        connection.setUseStreamManagement(true);
Run Code Online (Sandbox Code Playgroud)

但后来当我检查流管理时,它返回false.

xmpp smack stream-management

2
推荐指数
1
解决办法
1475
查看次数

如何在xmpp中将用户添加到名册中?

我已经使用以下代码成功创建了一个用户:

accountmanager = new org.jivesoftware.smack.AccountManager(connection);
accountmanager.createAccount(fbuserid,fbuserid);
Run Code Online (Sandbox Code Playgroud)

但是我无法使用以下代码将其他用户添加到已登录用户的名册中:

 public void createEntry(String user, String name, String[] groups) throws XMPPException {
    // Create and send roster entry creation packet.
    RosterPacket rosterPacket = new RosterPacket();
    rosterPacket.setType(IQ.Type.SET);
    RosterPacket.Item item = new RosterPacket.Item(user, name);
    if (groups != null) {
        for (String group : groups) {
            if (group != null) {
                item.addGroupName(group);
            }
        }
    }
    rosterPacket.addRosterItem(item);
    // Wait up to a certain number of seconds for a reply from the server.
    PacketCollector collector = connection.createPacketCollector(
            new PacketIDFilter(rosterPacket.getPacketID())); …
Run Code Online (Sandbox Code Playgroud)

android xmpp smack

2
推荐指数
1
解决办法
3108
查看次数

Android smack服务器收据确认

我正在尝试使用XMPP创建聊天应用程序.为此,我参考了本教程并成功实现了它.但是现在我无法获得服务器收到的特定消息并更新我的本地数据库.请告诉我如何做到这一点.

我正在用chatId保存一条消息.那么从哪个方法获取此收据消息ID?

android xmpp smack

2
推荐指数
1
解决办法
2645
查看次数

使用Smack Android将String转换为XMPP Stanza

要么

  • Q)从String生成XMPP Stanza.

  • Q)将字符串转换为XMPP Stanza.

在Android中使用Smack库,

Message message = new Message();
message.setStanzaId("123");
message.setFrom("923442621149");
message.setType(Message.Type.chat);
message.setBody("shanraisshan");

final String msgString = message.toXML().toString();
Log.e("message --->", msgString);
Run Code Online (Sandbox Code Playgroud)

上面的代码生成后面的节

msgString:

<message from='923442621149' id='123' type='chat'><body>shanraisshan</body></message>
Run Code Online (Sandbox Code Playgroud)

我已将此msgString保存到我的数据库中.

现在,我想要做的是,从数据库中检索此字符串

  • 将此msgString转换回Java Message Class
  • 这样我就可以使用属性(From,Body,Id)
  • 使用message.getFrom()

由于MessageStanza的子类,我尝试了以下代码:

Stanza stanza = new Stanza() {
    @Override
    public CharSequence toXML() {
        return msgString;
    }
};
Log.e("stanza XML --->", stanza.toXML().toString());
Log.e("stanza getFrom() ->", stanza.getFrom() + ":");
Log.e("stanza getStanzaId() ->", stanza.getStanzaId() + ":");
Run Code Online (Sandbox Code Playgroud)

控制台日志打印如下 …

java android xmpp smack asmack

2
推荐指数
1
解决办法
1549
查看次数

如何在android smack 4.2.0-beta1中使用MucEnterConfiguration?

我想重新加入房间,不想要任何历史记录,但不推荐使用DiscussionHistory.所以我找到了类MucEnterConfiguration.但是我无法创建MucEnterConfiguration的对象.

  1. MucEnterConfiguration是一个final类,所以它不能扩展,
    也没有公共构造函数.

  2. MucEnterConfiguration.Builder也是最终类,因此它不能
    扩展,也没有公共构造函数.

我怎样才能创造它的对象.

谢谢

android xmpp smack

2
推荐指数
1
解决办法
786
查看次数