代码之家  ›  专栏  ›  技术社区  ›  Ben

我的WebSocket没有按预期工作,服务器是用Java实现的,客户端是用JavaScript编写的。

  •  1
  • Ben  · 技术社区  · 14 年前

    在我的Java服务器和JavaScript客户端之间,我似乎遇到了一个“正确”的连接问题。它看起来连接正常,客户机发送它的头正常,但这是它所能做到的。这个 onopen onmessage 功能永远不会触发。

    下面是Java服务器的代码:

    import java.net.*;
    import java.io.*;
    public class Server {
        static DataOutputStream out;
        public static void main(String[] args) {
            try {
                ServerSocket serverSocket = new ServerSocket(8112);
                System.out.println("Server Started");
                while(true) {
                Socket socket = serverSocket.accept();
                System.out.println("A client connected");
                out = new DataOutputStream(socket.getOutputStream());
    
                //Send a simple-as-can-be handshake encoded with UTF-8
                String handshake = "HTTP/1.1 101 Web Socket Protocol Handshake\r" +
                "Upgrade: WebSocket\r" +
                "Connection: Upgrade\r" +
                "WebSocket-Origin: http://localhost\r" +
                "WebSocket-Location: ws://localhost:8112/\r" +
                "WebSocket-Protocol: sample\r\n\r\n";
                out.write(handshake.getBytes("UTF8"));
                System.out.println("Handshake sent.");
    
                //Send message 'HI!' encoded with UTF-8
                String message = "HI!";
                out.write(0x00);
                out.write(message.getBytes("UTF8"));
                out.write(0xff);
                System.out.println("Message sent!");
    
                //Cleanup
                socket.close();
                out.close();
                System.out.println("Everything closed!");
            }
        } catch(Exception e) {
            System.out.println(e.getMessage());
        }
    }
    

    这是客户的代码:

    <html>
      <head>
        <meta charset="UTF-8">
        <script>
          function load() {
            var ssocket = new WebSocket("ws://localhost:8112/");
            socket.onopen = function(e) { alert("opened"); }
            socket.onclose = function(e) { alert("closed"); }
            socket.onmessage = function(e) { alert(e.data); }
          }
        </script>
      </head>
        <body onload="load();">
        </body>
    </html>
    

    为什么不会 开放式 在消息中 触发?我尝试过很多不同的事情,但似乎做不到。

    我做错什么了?

    2 回复  |  直到 9 年前
        1
  •  5
  •   SimonJ    14 年前

    协议中有一个挑战响应方面,您似乎缺少了它——客户机发送了两个额外的头和一些随机数据:

    GET /demo HTTP/1.1
    Host: example.com
    Connection: Upgrade
    Sec-WebSocket-Key2: 12998 5 Y3 1  .P00
    Sec-WebSocket-Protocol: sample
    Upgrade: WebSocket
    Sec-WebSocket-Key1: 4 @1  46546xW%0l 1 5
    Origin: http://example.com
    
    ^n:ds[4U
    

    服务器将通过以下方式获得MD5响应:

    • 从每个键中提取数字(4146546015、1299853100)
    • 除以键中的空格数
    • 将键序列化为4字节整数,并与数据连接
    • 计算MD5摘要

    做出如下反应:

    HTTP/1.1 101 WebSocket Protocol Handshake
    Upgrade: WebSocket
    Connection: Upgrade
    Sec-WebSocket-Origin: http://example.com
    Sec-WebSocket-Location: ws://example.com/demo
    Sec-WebSocket-Protocol: sample
    
    8jKS'y:G*Co,Wxa-
    

    此过程旨在防止非WebSocket请求由WebSocket服务器处理-请参见第1.3节 WebSocket protocol 详情。

        2
  •  0
  •   user207421    14 年前

    这里可能有很多问题。HTTP是一种请求-响应协议。您不应该首先从服务器发送:您应该首先从客户机发送一个请求。行尾终止符在HTTP中定义为\r\n。您应该在服务器上为每个连接创建一个新线程。您应该关闭输出流,而不是套接字。