java - 使用 Android Websocket 监听 URL
问题描述
我用 SpringBoot 做了一个简单的网络聊天,效果很好。现在我正在尝试使用 Android 客户端连接到它。
在 SpringBoot 中,我处理不同的 URL。“/message-flow”用于真正的消息传输,“/echo”是返回相同文本的测试 URL。两者都能正常工作。这是我的控制器:
@MessageMapping("/message-flow")
public void broadcast(@Payload Message message, Principal principal) throws SQLException {
String sender = principal.getName();
String receiver = message.getReceiver();
// Send message to the receiver
messagingTemplate.convertAndSendToUser(receiver, "/queue/reply", message);
// Some extra actions: saving to DB and so on
}
// For android developing
@MessageMapping("/echo")
public void echo(@Payload String message) {
message = "Server returns: " + message;
messagingTemplate.convertAndSend("/queue/echo-reply", message);
}
从客户端(浏览器)我将消息发送到一个 URL 并从另一个 URL 收听。例如,我发送这样的真实消息:stompClient.send("/app/message-flow", {}, userJson);
并测试这样的回显消息:stompClient.send("/app/echo", {}, "test text");
。这就是我连接和接收的方式:
function connect() {
var socket = new SockJS("/chat-messaging");
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
stompClient.subscribe("/user/queue/reply", function (data) {
var message = JSON.parse(data.body);
broadcastMessage(message);
});
stompClient.subscribe("/queue/echo-reply", function (data) {
console.log("we got some message");
var message = data.body;
});
});
}
我的应用程序部署在Heroku上。现在我需要从 Android 连接到它。
SO,第一个问题是:Android Websocket 中的不同 URL 分别在哪里?我已经阅读了许多指南,并且只定义了端点 URL。
第二个问题是我的 Android 应用程序没有连接到我的 Heroku 应用程序。请看一下我的Android代码:
class ServerConnection extends AsyncTask {
private static final String SERVER = "ws://echo.websocket.org"; // it works
private static final String CHAT_SERVER = "ws://chat-vu.herokuapp.com/chat-messaging"; // it doesn't work
private static final int TIMEOUT = 5000;
@Override
protected Object doInBackground(Object[] objects) {
WebSocket ws = null;
try {
ws = connect();
} catch (IOException | WebSocketException e) {
e.printStackTrace();
return null;
}
String text = "hi from app";
ws.sendText(text);
// Close the WebSocket.
//ws.disconnect();
return null;
}
private static WebSocket connect() throws IOException, WebSocketException
{
return new WebSocketFactory()
.setConnectionTimeout(TIMEOUT)
.createSocket(CHAT_SERVER)
.addListener(new WebSocketAdapter() {
// A text message arrived from the server.
public void onTextMessage(WebSocket websocket, String message) {
Log.d("myLog", "We got some text: " + message);
}
})
.addExtension(WebSocketExtension.PERMESSAGE_DEFLATE)
.connect();
}
}
当我将测试消息发送到“ws://echo.websocket.org”时,我将其取回。当我将它发送到“ws://chat-vu.herokuapp.com/chat-messaging”时,我收到一个错误:
2020-07-19 10:44:53.399 8881-9254/ru.aconsultant.firstproject W/System.err: com.neovisionaries.ws.client.OpeningHandshakeException: The status code of the opening handshake response is not '101 Switching Protocols'. The status line is: HTTP/1.1 200
2020-07-19 10:44:53.399 8881-9254/ru.aconsultant.firstproject W/System.err: at com.neovisionaries.ws.client.HandshakeReader.validateStatusLine(HandshakeReader.java:232)
2020-07-19 10:44:53.400 8881-9254/ru.aconsultant.firstproject W/System.err: at com.neovisionaries.ws.client.HandshakeReader.readHandshake(HandshakeReader.java:54)
2020-07-19 10:44:53.400 8881-9254/ru.aconsultant.firstproject W/System.err: at com.neovisionaries.ws.client.WebSocket.readHandshake(WebSocket.java:3412)
2020-07-19 10:44:53.400 8881-9254/ru.aconsultant.firstproject W/System.err: at com.neovisionaries.ws.client.WebSocket.shakeHands(WebSocket.java:3291)
2020-07-19 10:44:53.400 8881-9254/ru.aconsultant.firstproject W/System.err: at com.neovisionaries.ws.client.WebSocket.connect(WebSocket.java:2326)
2020-07-19 10:44:53.401 8881-9254/ru.aconsultant.firstproject W/System.err: at ru.aconsultant.firstproject.ServerConnection.connect(MainActivity.java:316)
2020-07-19 10:44:53.401 8881-9254/ru.aconsultant.firstproject W/System.err: at ru.aconsultant.firstproject.ServerConnection.doInBackground(MainActivity.java:288)
2020-07-19 10:44:53.401 8881-9254/ru.aconsultant.firstproject W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:333)
2020-07-19 10:44:53.401 8881-9254/ru.aconsultant.firstproject W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2020-07-19 10:44:53.401 8881-9254/ru.aconsultant.firstproject W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
2020-07-19 10:44:53.401 8881-9254/ru.aconsultant.firstproject W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2020-07-19 10:44:53.402 8881-9254/ru.aconsultant.firstproject W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2020-07-19 10:44:53.402 8881-9254/ru.aconsultant.firstproject W/System.err: at java.lang.Thread.run(Thread.java:764)
但即使它连接了,我仍然需要弄清楚如何将消息发送到“/echo”或“/message-flow”,以及如何收听不同的 URL。
提前致谢。
解决方案
推荐阅读
- angularjs - AngularJS 视图未在 Firefox 中显示
- c - 将 C-Function 编译到 Postgres 时出现问题;编译器没有找到 postgres.h
- node.js - node.js 仅在服务器端使用会话值
- ubuntu - 如何将我的 Ubuntu 服务器链接到我的 GitHub 存储库?
- jenkins - 格里特詹金斯集成
- c# - 我需要从字符串中删除所有符号以创建忽略标点符号的`IEqualityComparer`
- node.js - 在 Nginx 上运行 NuxtJS 应用程序时出现 504 网关超时错误
- azure - 如何为 Azure 发布管道配置包文件路径?
- android - Kotlin 协程:尝试在空对象引用上调用虚拟方法“void androidx.lifecycle.MutableLiveData.postValue(java.lang.Object)”
- sql - 如何有效地将树状数据结构插入 postgres