使用android作为服务器和浏览器作为客户端创建websocket握手

理查德

我希望能够将浏览器用作我的Android设备上的短信编辑器(例如https://www.mysms.com)。因此,我开始编写一个充当套接字服务器并使用浏览器作为客户端的android应用(例如http://www.websocket.org/echo.html)。我能够从该客户端访问我的应用程序并从中获取消息,但是我现在遇到了WebSocket握手(Sec-WebSocket-Key等)问题。

编辑:

我按照本教程编写了Android服务器:http : //android-er.blogspot.co.at/2014/02/android-sercerclient-example-server.html

当我尝试从http://www.websocket.org/echo.html到达该服务器时,出现此js错误:WebSocket握手期间出错:状态行无效

编辑:

所以我添加了带有Sec-WebSocket-Accept:行的编码密钥的标头

// get the key from the input 
InputStream inputStream = hostThreadSocket.getInputStream();
            String line = "";
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(inputStream));
                while ((line = reader.readLine()) != null) {
                    if(line.contains("Sec-WebSocket-Key:")){ // stop then the line containing the key is found
                        break;
                    }
                }

            } catch (IOException e) {
            }
String key = line.replace("Sec-WebSocket-Key:", "");

并使用以下方法对结果进行编码:

static String encodeString(String input)  {

    MessageDigest digest = null;
    try {
        digest = MessageDigest.getInstance("SHA-1");
        byte[] inputBytes = input.getBytes();
        byte[] hashBytes = digest.digest(inputBytes);
        return  Base64.encodeToString(hashBytes, Base64.DEFAULT);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}

并传递标题,如下所示:

 String key = line.replace("Sec-WebSocket-Key:", "");
            key = key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
            key = encodeString(key).replace("\n", "");;

            String header = "HTTP/1.1 101 Switching Protocols\r\n" +
                    "Upgrade: websocket \r\n" +
                    "Connection: Upgrade \r\n" +
                    "Sec-WebSocket-Accept: " + key + "\r\n"+
                    "Sec-WebSocket-Protocol: chat\r\n\r\n" + msgReply;
            printStream.print(header);
            printStream.close();

响应头现在看起来像这样:

Connection:Upgrade\r\n 
Sec-WebSocket-Accept:/Qg4DR68UCCo9VKy4vbDgswCU8Y=\r\n
Upgrade:websocket\r\n

但是我仍然收到错误:失败:WebSocket握手期间错误:错误的“ Sec-WebSocket-Accept”头值

理查德

我终于可以进行websocket握手了。我不知道到底有什么改变使我成功,但这是有效的代码:

InputStream inputStream = hostThreadSocket.getInputStream();
            String line = "";
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(inputStream));
                while ((line = reader.readLine()) != null) {
                    if (line.contains("Sec-WebSocket-Key: ")) { // check if its the header-line containing the websocket key
                        break;
                    }
                }
            } catch (IOException e) {
                Log.e(TAG_TEST, e.getMessage(), e);
            }

            Matcher matcher = pattern.matcher(line); // with pattern "Sec-WebSocket-Key:[ ]*([^\r^\n]*)" to parse the key out of the line
            boolean matches = matcher.matches();
            String key = matcher.group(1);
            key = key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; // adding the "magic string"
            key = encodeString(key);

            String header = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +                       
                    "Upgrade: websocket\r\n" +
                    "Connection: Upgrade\r\n" +
                    "Sec-WebSocket-Accept:" + key + "\r\n\r\n";
            printStream.print(header);

这就是我对密钥进行编码的方法

static String encodeString(String input) {
    MessageDigest digest = null;
    try {
        digest = MessageDigest.getInstance("SHA-1");
        byte[] inputBytes = input.getBytes();
        byte[] hashBytes = digest.digest(inputBytes);
        return Base64.encodeToString(hashBytes, Base64.NO_WRAP);
    } catch (NoSuchAlgorithmException e) {
        Log.e(TAG_TEST, e.getMessage(), e);
    }
    return "";
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用android作为服务器和浏览器作为客户端创建websocket握手

来自分类Dev

如何在javascript(客户端)和java(服务器)中完成WebSocket握手?

来自分类Dev

客户端-服务器安全连接握手

来自分类Dev

(浏览器作为客户端)$ .ajax上的HTTP 405 POST到Node服务

来自分类Dev

使用浏览器作为python套接字中的客户端

来自分类Dev

如何使用网络浏览器作为VNC客户端?

来自分类Dev

我可以使用客户端(浏览器)IP作为cURL的代理吗?

来自分类Dev

如何为服务器握手解释浏览器的Sec-websocket-key?

来自分类Dev

如何为服务器握手解释浏览器的Sec-websocket-key?

来自分类Dev

服务器端和客户端浏览器宽度和PHP中的引导轮播问题

来自分类Dev

aiohttp Websocket 客户端和 HTTP 服务器

来自分类Dev

客户端-服务器架构:100%Android(作为服务器的Android)或Java EE + Android?

来自分类Dev

可以将单个应用程序作为服务器和客户端并查询自身

来自分类Dev

从服务器端(从另一个容器)和客户端(浏览器)使用相同的URL引用Docker容器

来自分类Dev

客户端无需关闭握手即可与websocket断开连接(关闭浏览器选项卡)。如何正确处理呢?

来自分类Dev

如何使用客户端套接字作为服务器套接字python

来自分类Dev

如何使用lsh作为没有密码的OpenSSHD服务器的客户端?

来自分类Dev

Express,用于浏览器客户端和node.js客户端的socket.io服务器

来自分类Dev

在没有localhost /服务器,客户端,浏览器的情况下使用Less

来自分类Dev

使用CSS / JS从服务器磁盘向客户端浏览器渲染并提供HTML文件

来自分类Dev

在没有localhost /服务器,客户端,浏览器的情况下使用Less

来自分类Dev

如何使用 httpd.conf 防止从客户端浏览器访问服务器中的某种文件

来自分类Dev

在浏览器上显示服务器时间而不是客户端时间

来自分类Dev

加快网站的多图像从客户端浏览器到服务器的上传

来自分类Dev

浏览器与服务器在socket.io客户端行为上的差异

来自分类Dev

如何从服务器发送要在客户端浏览器中打开的 html 文件?

来自分类Dev

Websocket Autobahn Python 客户端:如何使用服务器和客户端证书连接到服务器?

来自分类Dev

简单宁静的JSON POST,以Java作为服务器,jquery作为客户端

来自分类Dev

没有浏览器的Java Websocket客户端

Related 相关文章

  1. 1

    使用android作为服务器和浏览器作为客户端创建websocket握手

  2. 2

    如何在javascript(客户端)和java(服务器)中完成WebSocket握手?

  3. 3

    客户端-服务器安全连接握手

  4. 4

    (浏览器作为客户端)$ .ajax上的HTTP 405 POST到Node服务

  5. 5

    使用浏览器作为python套接字中的客户端

  6. 6

    如何使用网络浏览器作为VNC客户端?

  7. 7

    我可以使用客户端(浏览器)IP作为cURL的代理吗?

  8. 8

    如何为服务器握手解释浏览器的Sec-websocket-key?

  9. 9

    如何为服务器握手解释浏览器的Sec-websocket-key?

  10. 10

    服务器端和客户端浏览器宽度和PHP中的引导轮播问题

  11. 11

    aiohttp Websocket 客户端和 HTTP 服务器

  12. 12

    客户端-服务器架构:100%Android(作为服务器的Android)或Java EE + Android?

  13. 13

    可以将单个应用程序作为服务器和客户端并查询自身

  14. 14

    从服务器端(从另一个容器)和客户端(浏览器)使用相同的URL引用Docker容器

  15. 15

    客户端无需关闭握手即可与websocket断开连接(关闭浏览器选项卡)。如何正确处理呢?

  16. 16

    如何使用客户端套接字作为服务器套接字python

  17. 17

    如何使用lsh作为没有密码的OpenSSHD服务器的客户端?

  18. 18

    Express,用于浏览器客户端和node.js客户端的socket.io服务器

  19. 19

    在没有localhost /服务器,客户端,浏览器的情况下使用Less

  20. 20

    使用CSS / JS从服务器磁盘向客户端浏览器渲染并提供HTML文件

  21. 21

    在没有localhost /服务器,客户端,浏览器的情况下使用Less

  22. 22

    如何使用 httpd.conf 防止从客户端浏览器访问服务器中的某种文件

  23. 23

    在浏览器上显示服务器时间而不是客户端时间

  24. 24

    加快网站的多图像从客户端浏览器到服务器的上传

  25. 25

    浏览器与服务器在socket.io客户端行为上的差异

  26. 26

    如何从服务器发送要在客户端浏览器中打开的 html 文件?

  27. 27

    Websocket Autobahn Python 客户端:如何使用服务器和客户端证书连接到服务器?

  28. 28

    简单宁静的JSON POST,以Java作为服务器,jquery作为客户端

  29. 29

    没有浏览器的Java Websocket客户端

热门标签

归档