首页 > 解决方案 > 使用 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。

提前致谢。

标签: javaandroidurlwebsocket

解决方案


推荐阅读