在我团队的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) 在以下场景中,什么是最佳/良好的服务绑定/通信实践(我希望标题有点意义):
包括若干服务方法的业务层(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()方法中获取,但这真的让人觉得不可思议.其他想法?正确的做法?
我正在为持久订阅编程一个信使服务(它可能最终不耐用,我们仍在讨论这个问题)我正在寻找一些关于如何处理我们的服务器由于某种原因而暂时停机的情况的建议我们需要自动重新订阅该主题.以下是它如何连接的示例代码:
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) 如果您有与服务通信的活动,或与服务通信的其他服务,哪种"通信协议"更快将其消息传递给绑定方?
传输到服务/从服务传输的消息都是字符串或可分配对象.
如果您想将批量数据发送到其他服务或活动,我很难确定哪种方法更快.我找不到有关Messenger发送的Intents或Messages的处理速度的详细信息.
谁有这方面的体验?
我尝试发送代码(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
我想像使用MQTT协议的whatsapp一样实现一个messenger.我应该阅读哪些教程?
我对以下几点感到困惑:
我知道这些是非常基本的问题,但不幸的是我找不到任何指导初始步骤的资源.
结论:
在与已经在MQTT中实施大规模信使部署的人交谈之后,我得出结论,MQTT应该只使用一个协议.Pub/Sub很适合开始,但您应该拥有一层自己的业务逻辑,以实现灵活性和性能.但是,您可以使用pub/sub树实现大多数基本信使要求,但是您将受限于它,以后将难以扩展.
有没有人创建过一个在java中公开facebook messenger bot API的开源项目?(或我可以转换的另一种语言?)
基本上是堆栈的对象层次结构:https: //developers.facebook.com/docs/messenger-platform/send-api-reference
我宁愿不仅使用JsonObjects等,也不使用Maps来提取传入的JSON聊天消息或构建传出的结构化聊天回复.如果存在这样的开源项目 - 我还没有找到它.
我正在尝试将用户位置放在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 Messenger 的架构,但我想深入了解。
这是我所知道的一些事情(如果我错了请纠正我)
这是我的一些想法
想法 1 - 在应用程序服务器内部,我们将为每个接收者维护一个通道,将与该接收者相关的所有新消息推送到该通道中,从该通道读取并将其推送到客户端。
我们如何维护每个发送者/接收者线程(即对话)接收到的消息?
想法 2 - 在应用程序服务器内部,我们将为每个发送者-接收者组合(即对话)维护一个通道,并从所有接收者通道读取数据并将其推送到客户端。
我们如何处理每个接收器的这么多通道?
这是我的几个问题
应用服务器堆栈
持久数据存储
如果您想投反对票,请评论原因
architecture chat system-design messenger facebook-messenger
我不知道如何配置Kafka
的Symfony 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)
请给我最好的例子。谢谢!