Slack 实时消息传递 websocket
Slack Real-Time-Messaging websocket
正在尝试在应用程序中实现这一点。 Slack RTM
调用 rtm.start 后,我得到 JSON-response 并提取 wss url。之后,按照文档我需要打开 websocket。
尝试了两个库
compile 'com.koushikdutta.async:androidasync:2.+'
compile 'org.java-websocket:Java-WebSocket:1.3.0'
首先给出 TimeoutException,其次 - 进入 onClose 方法,其中 i = -1,b = true(未调用 onError 或 onOpen,请参见下面的代码)。
connection = (HttpURLConnection) new URL(getQuery(URL + "rtm.start",
new Pair<>("token", TOKEN))).openConnection();
final String response = readIs(connection.getInputStream());
JSONObject jResponse = new JSONObject(response);
String uri = (String) jResponse.get("url");
使用 Java-WebSocket 我试过这段代码(github 上示例的标准):
connectWebSocket(uri);
private void connectWebSocket(String uriStr) {
URI uri;
try {
uri = new URI(uriStr);
} catch (URISyntaxException e) {
e.printStackTrace();
return;
}
log(uri.toString());
log(uri.toASCIIString());
mWebSocketClient = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake serverHandshake) {
log("Opened");
mWebSocketClient.send("Hello from " + Build.MANUFACTURER + " " + Build.MODEL);
}
@Override
public void onMessage(String s) {
log(s);
}
@Override
public void onClose(int i, String s, boolean b) {
log("Closed " + s + " " + b + " number: " + i);
}
@Override
public void onError(Exception e) {
log("Error " + e.getMessage());
}
};
mWebSocketClient.connect();
}
正如我上面所说的 - 只调用了 onClose。
使用 AndroidAsync 也尝试了示例中的标准代码:
AsyncHttpClient.getDefaultInstance().websocket(uri, "wss", (ex, webSocket) -> {
if (ex != null) {
log(ex.getMessage());
return;
}
webSocket.send("a string");
});
我以前从未在 android 上使用过 websockets,因此无法理解我做错了什么。感谢您的帮助。
Url in JSON 的类型是
wss://ms156.slack-msgs.com/websocket/LYBUMUtG-bqj9HkKwEB5Yk_DCyPeRbnZ4viUJYHzrzJnLr-M74d46IQ9khTF8rik-v6ckJ4hqXPRi666hyPR6pismYBZBsggJUade3LOARc=
最后我的同事设法使用 OkHttp 打开这个套接字。如果有人感兴趣 - 下面提供了测试项目的代码:
http://pastebin.com/3YhLjAn7
有趣的是——最后我们决定不使用 RTM,因为一个连接的负载太高了——你会收到来自所有聊天的事件,而且没有办法只为一个特定的设置过滤器。
正在尝试在应用程序中实现这一点。 Slack RTM 调用 rtm.start 后,我得到 JSON-response 并提取 wss url。之后,按照文档我需要打开 websocket。 尝试了两个库
compile 'com.koushikdutta.async:androidasync:2.+'
compile 'org.java-websocket:Java-WebSocket:1.3.0'
首先给出 TimeoutException,其次 - 进入 onClose 方法,其中 i = -1,b = true(未调用 onError 或 onOpen,请参见下面的代码)。
connection = (HttpURLConnection) new URL(getQuery(URL + "rtm.start",
new Pair<>("token", TOKEN))).openConnection();
final String response = readIs(connection.getInputStream());
JSONObject jResponse = new JSONObject(response);
String uri = (String) jResponse.get("url");
使用 Java-WebSocket 我试过这段代码(github 上示例的标准):
connectWebSocket(uri);
private void connectWebSocket(String uriStr) {
URI uri;
try {
uri = new URI(uriStr);
} catch (URISyntaxException e) {
e.printStackTrace();
return;
}
log(uri.toString());
log(uri.toASCIIString());
mWebSocketClient = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake serverHandshake) {
log("Opened");
mWebSocketClient.send("Hello from " + Build.MANUFACTURER + " " + Build.MODEL);
}
@Override
public void onMessage(String s) {
log(s);
}
@Override
public void onClose(int i, String s, boolean b) {
log("Closed " + s + " " + b + " number: " + i);
}
@Override
public void onError(Exception e) {
log("Error " + e.getMessage());
}
};
mWebSocketClient.connect();
}
正如我上面所说的 - 只调用了 onClose。
使用 AndroidAsync 也尝试了示例中的标准代码:
AsyncHttpClient.getDefaultInstance().websocket(uri, "wss", (ex, webSocket) -> {
if (ex != null) {
log(ex.getMessage());
return;
}
webSocket.send("a string");
});
我以前从未在 android 上使用过 websockets,因此无法理解我做错了什么。感谢您的帮助。
Url in JSON 的类型是
wss://ms156.slack-msgs.com/websocket/LYBUMUtG-bqj9HkKwEB5Yk_DCyPeRbnZ4viUJYHzrzJnLr-M74d46IQ9khTF8rik-v6ckJ4hqXPRi666hyPR6pismYBZBsggJUade3LOARc=
最后我的同事设法使用 OkHttp 打开这个套接字。如果有人感兴趣 - 下面提供了测试项目的代码: http://pastebin.com/3YhLjAn7 有趣的是——最后我们决定不使用 RTM,因为一个连接的负载太高了——你会收到来自所有聊天的事件,而且没有办法只为一个特定的设置过滤器。