标签: messenger

Android Service-Activity 2方式通讯

在我团队的Android应用程序中,我有一个从启动运行的服务,该服务与服务器通信以执行诸如登录,注册,手机之间聊天以及更新手机数据库之类的操作。

我需要使我的服务与活动进行双向通信:例如,我目前正在进行登录活动,并且用户名和密码是从应用程序屏幕上的文本字段获取的字符串,并且我已经能够通过它们服务,以向服务器发送授权命令。

public void loginPressed(View v){
    usernameStr = usernameField.getText().toString();
    passwordStr = passwordField.getText().toString();

    if (!bound) return;
    Bundle b = new Bundle();
    Message msg = Message.obtain(null, ChatService.LOGIN);
    try {
        b.putString("username", usernameStr);
        b.putString("password", passwordStr);
        msg.setData(b);
        messenger.send(msg);
    }
    catch (RemoteException e) {

    }
Run Code Online (Sandbox Code Playgroud)

正如我所期望的那样。当服务器以一条消息说明登录是否成功时,我需要它将消息传递回活动,以便如果成功则可以启动主活动,或者如果没有成功则提示重新输入。

我试图使用msg.replyTo字段来获取返回信息,以将信息发送回去,但是当我运行应用程序时,它强制关闭并带有空指针异常,我不知道为什么会这样。这是似乎是罪魁祸首的代码:

private class IncomingHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch(msg.what) {
        case LOGIN:

            Bundle b = msg.getData();
            String username = b.getString("username");
            String password = b.getString("password");

            String loginMessage = TCPCall.login(username, password);
            connection.sendMessage(loginMessage);

            String loginReturn = connection.retrieveMessage();
            Message …
Run Code Online (Sandbox Code Playgroud)

java service android handler messenger

5
推荐指数
1
解决办法
1997
查看次数

服务之间异步通信的最佳实践

在以下场景中,什么是最佳/良好的服务绑定/通信实践(我希望标题有点意义):

包括若干服务方法的业务层(BL),所述服务方法共享(作为公共通信端点)异步套接字服务(SS),其可以由那些方法绑定并用于套接字IO.

例如,BL抓住SL并调用send(消息),然后等待响应.

我首先使用了回调和绑定模式.由于我在使用绑定模式的清晰设计方面遇到了一些问题(缺少消息队列以及在主线程中完成的所有操作),我现在正在尝试使用消息模式.

基本上,BL服务和SL服务现在都有一个Messenger和一个相应的处理程序:

private final IncomingHandler incomingHandler = new IncomingHandler();
private final Messenger messengerReceiver = new Messenger(incomingHandler);
private class IncomingHandler extends Handler {
  @Override
  public void handleMessage(Message msg) {
  ...
  }
}
Run Code Online (Sandbox Code Playgroud)

其中一个BL是AbstractAccountAuthenticator实现的子类

addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options){
     ...
     if(socketConnectionState != null){
        Bundle authBundle = new Bundle();
        authBundle.putString("password", password);
        authBundle.putString("username", account.name);
        Message message = Message.obtain(null, SocketConnectionHandler.SEND_REQUEST, authBundle);
        message.replyTo = messengerReceiver;
        socketConnectionState.getMessenger().send(message);
...}
Run Code Online (Sandbox Code Playgroud)

它也使用SL来获取authToken.addAccount()方法要么在Bundle中立即返回结果(authToken),要么调用响应回调方法.现在如果我通过SL在addAccount中请求auth令牌,我将如何处理以传回结果?

这里的主要问题是结果不会返回给调用方法(addAccount()),而是返回给messengerReceiver处理程序.

我能想到的唯一方法是BlockingQueue,它由消息处理程序提供响应,然后在addAccount()方法中获取,但这真的让人觉得不可思议.其他想法?正确的做法?

service binding android design-patterns messenger

5
推荐指数
1
解决办法
781
查看次数

设置JMS连接的理想方式,以便自动重新连接

我正在为持久订阅编程一个信使服务(它可能最终不耐用,我们仍在讨论这个问题)我正在寻找一些关于如何处理我们的服务器由于某种原因而暂时停机的情况的建议我们需要自动重新订阅该主题.以下是它如何连接的示例代码:

public void DurableChatter(String broker, String username, String password)
{
    javax.jms.MessageProducer publisher = null;
    javax.jms.MessageConsumer subscriber = null;
    javax.jms.Topic topic = null;

    //Create a connection:
    try{
        javax.jms.ConnectionFactory factory;
        factory = (new progress.message.jclient.ConnectionFactory (broker));
        connection = factory.createConnection (username, password);

        //Durable Subscriptions are indexed by username, clientID and subscription name
        //It is a good proactice to set the clientID:
        connection.setClientID(CLIENT_ID);
        pubSession = connection.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
        subSession = connection.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
    }
    catch (javax.jms.JMSException jmse){
        System.err.println ("Error: Cannot connect to Broker - " + broker);
        jmse.printStackTrace();
        System.exit(1); …
Run Code Online (Sandbox Code Playgroud)

java jms messenger

5
推荐指数
1
解决办法
3795
查看次数

使用信使或意图进行更快速的通信是什么?

如果您有与服务通信的活动,或与服务通信的其他服务,哪种"通信协议"更快将其消息传递给绑定方?

传输到服务/从服务传输的消息都是字符串或可分配对象.

如果您想将批量数据发送到其他服务或活动,我很难确定哪种方法更快.我找不到有关Messenger发送的Intents或Messages的处理速度的详细信息.

谁有这方面的体验?

android parcelable android-intent android-service messenger

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

C#上信使电报编程的难点

我尝试发送代码(TLRequestAuthSendCode)但它没有来.什么可能有问题?

部分代码:

TLContext tlContext = new TLApiContext();
TcpClient tcpClient = new TcpClient();
tcpClient.Connect(connections[0].getAddress(), (int)connections[0].getPort());
TLRequestAuthSendCode tlRequestAuthSendCode = new TLRequestAuthSendCode("+79241652563",
0, 19114, "1e489fd15dcff313e5b3e7a08e8fc791", "en");
tlRequestAuthSendCode.serializeBody(new StreamWriter(tcpClient.GetStream()));
Run Code Online (Sandbox Code Playgroud)

链接:https://github.com/egor-st-dev/Sharpogram/blob/master/Sharpogram/RequestApiId.cs

c# api rpc messenger telegram

5
推荐指数
1
解决办法
2784
查看次数

如何使用MQTT实现whatsapp类型信使?

我想像使用MQTT协议的whatsapp一样实现一个messenger.我应该阅读哪些教程?

我对以下几点感到困惑:

  1. 我应该如何实现消息传递的主题结构?(目前我正在使用/ domainname/phonenumber /(如果手机A要向手机B发送消息,它会向/ domainname/B /发布消息)
  2. 如果客户端B离线并在一段时间后上线,当客户端离线时,它将如何接收发送给他的消息(到主题/域名/ B /)?
  3. 如何实现发送/发送/读取确认?

我知道这些是非常基本的问题,但不幸的是我找不到任何指导初始步骤的资源.

结论:
在与已经在MQTT中实施大规模信使部署的人交谈之后,我得出结论,MQTT应该只使用一个协议.Pub/Sub很适合开始,但您应该拥有一层自己的业务逻辑,以实现灵活性和性能.但是,您可以使用pub/sub树实现大多数基本信使要求,但是您将受限于它,以后将难以扩展.

instant-messaging mqtt messenger

5
推荐指数
1
解决办法
3643
查看次数

用于java的Facebook Messenger bot对象结构

有没有人创建过一个在java中公开facebook messenger bot API的开源项目?(或我可以转换的另一种语言?)

基本上是堆栈的对象层次结构:https: //developers.facebook.com/docs/messenger-platform/send-api-reference

我宁愿不仅使用JsonObjects等,也不使用Maps来提取传入的JSON聊天消息或构建传出的结构化聊天回复.如果存在这样的开源项目 - 我还没有找到它.

java facebook bots messenger

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

是否可以从Messenger Webview获取位置

我正在尝试将用户位置放在Facebook Messenger Chat-Extension中.我打开webview并像往常一样问:

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0
};

function success(pos) {
  var crd = pos.coords;

  console.log('Your current position is:');
  console.log(`Latitude : ${crd.latitude}`);
  console.log(`Longitude: ${crd.longitude}`);
  console.log(`More or less ${crd.accuracy} meters.`);
};

function error(err) {
  console.warn(`ERROR(${err.code}): ${err.message}`);
};

navigator.geolocation.getCurrentPosition(success, error, options);
Run Code Online (Sandbox Code Playgroud)

我遇到了这个问题:错误(1):用户拒绝地理位置.
有没有办法通过聊天扩展Webview获取用户位置?谢谢

facebook webview messenger facebook-messenger

5
推荐指数
1
解决办法
371
查看次数

设计 Facebook 规模的信使/聊天服务器

我发现一些文章概述了 facebook Messenger 的架构,但我想深入了解。

信使架构

这是我所知道的一些事情(如果我错了请纠正我)

  • 当发送者发送消息时,我们需要将消息存储在一些持久数据存储中,如果接收者当时在线,我们需要将这些消息发送给接收者。这应该无缝地发生,即接收者不应该轮询新消息

这是我的一些想法

想法 1 - 在应用程序服务器内部,我们将为每个接收者维护一个通道,将与该接收者相关的所有新消息推送到该通道中,从该通道读取并将其推送到客户端。

我们如何维护每个发送者/接收者线程(即对话)接收到的消息?

想法 2 - 在应用程序服务器内部,我们将为每个发送者-接收者组合(即对话)维护一个通道,并从所有接收者通道读取数据并将其推送到客户端。

我们如何处理每个接收器的这么多通道?

这是我的几个问题

应用服务器堆栈

  • 如果收件人在线,如何直接转发消息?
  • 如何维护同一接收者的多个客户端,即接收者是否通过移动应用程序、网络浏览器登录。如何将消息转发给所有客户端?
  • 如何在应用服务器中保持连接,以便应用服务器有消息时会推送消息,而不是客户端不断轮询服务器?
  • 我们如何维护每个对话的标记为已读功能?
  • 如何在接收者上线时推送接收者所有未读消息?
  • 如何高效地获取对话历史记录?
  • 如何扩展到数百万个发送者/接收者?

持久数据存储

  • 最适合聊天类应用程序的数据存储是什么?
  • 数据的存储格式是什么?

如果您想投反对票,请评论原因

architecture chat system-design messenger facebook-messenger

5
推荐指数
0
解决办法
1579
查看次数

使用 Apache Kafka 作为队列传输的 Symfony Messenger

我不知道如何配置KafkaSymfony messenger。一切正常rabbitmq(我创建了信使和信使处理程序):

. 环境:

MESSENGER_TRANSPORT_DSN=amqp://user:password@myhost:5672/%2f/messages
Run Code Online (Sandbox Code Playgroud)

配置/包/messenger.yaml

framework:
  messenger:
    transports:
      async: "%env(MESSENGER_TRANSPORT_DSN)%"
Run Code Online (Sandbox Code Playgroud)

.env

MESSENGER_TRANSPORT_DSN=enqueue://node-1.kafka.myhost.com:9092/%2f/messages
Run Code Online (Sandbox Code Playgroud)

配置/包/messenger.yaml

framework:
  messenger:
    transports:
      async: "%env(MESSENGER_TRANSPORT_DSN)%"
Run Code Online (Sandbox Code Playgroud)

请给我最好的例子。谢谢!

php symfony messenger apache-kafka

5
推荐指数
1
解决办法
3432
查看次数