1

https://github.com/koush/android-websockets/blob/master/src/com/codebutler/android_websockets/WebSocketClient.java

是什么让它成为真正的 websocket 客户端,而不仅仅是一个直接的 socket 客户端?我看到它构造了 HTTP 请求,我想知道 websocket 与普通 Java 套接字的正式“定义”实际上是什么。

4

2 回答 2

2

WebSocket 协议由IETF 6455定义。

koush /android-websockets项目实现了 IETF 6455 版本的 WebSocket 协议。

WebSocket 连接以与 HTTP 兼容的握手开始,这使得它可以更轻松地与现有的 Web 基础设施集成。它还赋予了它安全的跨域能力。

一旦建立连接,WebSocket 连接就是全双工双向连接(例如不像 HTTP 长轮询)。但是,即使在这一点上,连接也不是原始套接字。WebSocket 是基于消息的(而不是像底层 TCP 层那样的流式传输),因此它需要数据框架以指示消息边界。每个 WebSocket 帧至少有 2 个字节的标头,用于指示帧的长度,是消息的最后一帧还是延续,数据是 UTF-8 还是原始二进制等。

此外,客户端(浏览器)到服务器 WebSocket 帧使用简单的运行 XOR 进行屏蔽,以避免 Web 中介(代理、缓存等)中的理论漏洞。

于 2012-08-16T14:42:14.293 回答
0

WebSocket 通过端口 80 处理 HTTP。这样的数据既可以是文本的也可以是二进制的,而且,已知的标头 - 预期的标记很容易看到,例如 HTTP 请求 302。然而,一个“普通的”Java Socket 可以是:

  • 命名管道
  • TCP/IP
  • UDP
  • 蓝牙

它是一种更通用的套接字机制,其中二进制数据速度具有最大吞吐量。

那将是“定义”,但它不是一成不变的,例如,您可以在通过 HTTP 发送之前通过 Base64 编码通过“WebSocket”发送二进制文件。

在 Koush 的案例中,他只是围绕标准创建了一个包装器(关键字是wrapperSocket )来处理 HTTP 请求。它可以解释,因此它不是一成不变的。例如,可以轻松地围绕蓝牙创建一个包装器,并将其称为“ BTSocket ”,甚至可以将其称为“ IPCSocket ”,用于进程间通信Socket

于 2012-08-16T00:36:53.990 回答