我一直在关注http-kit websockets 示例,后来在试图找到一种将 WS 通道映射到后端用户的惯用方法时陷入困境。
我尝试使用 Java 反射检查 org.httpkit.server.AsyncChannel 对象并获得以下属性:
| :name | :return-type | :declaring-class | :parameter-types | :exception-types | :flags |
|---------------------------------+----------------------+---------------------------------+----------------------------------------------------------------+-----------------------+---------------------|
| chunkSize | java.nio.ByteBuffer | org.httpkit.server.AsyncChannel | [int] | [] | #{:private :static} |
| firstWrite | void | org.httpkit.server.AsyncChannel | [java.lang.Object boolean] | [java.io.IOException] | #{:private} |
| isClosed | boolean | org.httpkit.server.AsyncChannel | [] | [] | #{:public} |
| isWebSocket | boolean | org.httpkit.server.AsyncChannel | [] | [] | #{:public} |
| messageReceived | void | org.httpkit.server.AsyncChannel | [java.lang.Object] | [] | #{:public} |
| onClose | void | org.httpkit.server.AsyncChannel | [int] | [] | #{:public} |
| org.httpkit.server.AsyncChannel | | org.httpkit.server.AsyncChannel | [java.nio.channels.SelectionKey org.httpkit.server.HttpServer] | [] | #{:public} |
| pingReceived | void | org.httpkit.server.AsyncChannel | [byte<>] | [] | #{:public} |
| readable | clojure.lang.Keyword | org.httpkit.server.AsyncChannel | [int] | [] | #{:private :static} |
| reset | void | org.httpkit.server.AsyncChannel | [org.httpkit.server.HttpRequest] | [] | #{:public} |
| send | boolean | org.httpkit.server.AsyncChannel | [java.lang.Object boolean] | [java.io.IOException] | #{:public} |
| sendHandshake | void | org.httpkit.server.AsyncChannel | [java.util.Map] | [] | #{:public} |
| serverClose | boolean | org.httpkit.server.AsyncChannel | [int] | [] | #{:public} |
| setCloseHandler | void | org.httpkit.server.AsyncChannel | [clojure.lang.IFn] | [] | #{:public} |
| setPingHandler | void | org.httpkit.server.AsyncChannel | [clojure.lang.IFn] | [] | #{:public} |
| setReceiveHandler | void | org.httpkit.server.AsyncChannel | [clojure.lang.IFn] | [] | #{:public} |
| toString | java.lang.String | org.httpkit.server.AsyncChannel | [] | [] | #{:public} |
| writeChunk | void | org.httpkit.server.AsyncChannel | [java.lang.Object boolean] | [java.io.IOException] | #{:private} |
nil
它似乎不包含任何明确的标识符,包括.toString
:
user=> (.toString ch)
"/0:0:0:0:0:0:0:1:3000<->/0:0:0:0:0:0:0:1:54538"
我能想到的唯一想法是:
1)保持connect!
功能不变:
(defonce channels (atom #{}))
(defn connect! [channel]
(log/info "channel open" channel)
(swap! channels conj channel))
2) 更新 WebSocket 客户端以在建立 WS 连接后立即发送 JWT 或环会话 ID 作为第一条消息,该连接允许将该(已经建立的)通道映射到可以识别用户的标识符(JWT 或环会话 ID)。
这有意义吗?或者它是一个大的反模式和对 WS RFC 的违反?抱歉,我之前没有在这么低的级别上使用过 WebSockets。