服务端 handler 接口改名 IWebsocketHandler → WebSocketHandler(仓颉推荐命名,去掉 I 前缀,不保留兼容),文件名同步为 websocket_handler.cj;README 与测试同步更新;版本 1.2.1
This commit is contained in:
@@ -29,7 +29,7 @@
|
||||
```cangjie
|
||||
import simcu::websocket.client.WebSocketClient
|
||||
import simcu::websocket.server.WebSocketServer
|
||||
import simcu::websocket.server.IWebsocketHandler
|
||||
import simcu::websocket.server.WebSocketHandler
|
||||
import simcu::websocket.server.WebSocketConnection
|
||||
import simcu::websocket.common.WebSocketMessage
|
||||
```
|
||||
@@ -110,10 +110,10 @@ server.groups() // 所有组名(快照)
|
||||
|
||||
### Handler 接口
|
||||
|
||||
`IWebsocketHandler` 只关心连接生命周期回调;端点路径由 `addHandler(path, factory)` 注册时指定,handler 自身不感知。每个连接在握手成功时由工厂创建一个独立的 handler 实例,因此 handler 内可持有该连接的会话状态(如 connectionId / 组信息),但不要持有会跨连接共享的 scoped 服务。
|
||||
`WebSocketHandler` 只关心连接生命周期回调;端点路径由 `addHandler(path, factory)` 注册时指定,handler 自身不感知。每个连接在握手成功时由工厂创建一个独立的 handler 实例,因此 handler 内可持有该连接的会话状态(如 connectionId / 组信息),但不要持有会跨连接共享的 scoped 服务。
|
||||
|
||||
```cangjie
|
||||
public interface IWebsocketHandler {
|
||||
public interface WebSocketHandler {
|
||||
func onConnect(conn: WebSocketConnection): Unit
|
||||
func onMessage(conn: WebSocketConnection, msg: WebSocketMessage): Unit
|
||||
func onClose(conn: WebSocketConnection, code: Int64, reason: String): Unit
|
||||
@@ -124,7 +124,7 @@ public interface IWebsocketHandler {
|
||||
实现示例:
|
||||
|
||||
```cangjie
|
||||
class MyHandler <: IWebsocketHandler {
|
||||
class MyHandler <: WebSocketHandler {
|
||||
public override func onConnect(conn: WebSocketConnection): Unit {
|
||||
conn.joinGroup("authed") // 握手成功即入组
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ cjc-version = "1.1.3"
|
||||
name = "websocket"
|
||||
organization = "simcu"
|
||||
description = "SimApi WebSocket 库(RFC 6455):事件回调式客户端与接口式服务端。客户端 connect/send(三重重载)/ping/close/terminate + onOpen/onMessage/onError/onClose;服务端 WebSocketServer(port) + addHandler(path, factory) 按路径路由、每连接独立 handler,链式门面 group(name)/conn(connId) 支持组管理/组播/单播/广播,连接断开自动清组"
|
||||
version = "1.2.0"
|
||||
version = "1.2.1"
|
||||
target-dir = ""
|
||||
output-type = "static"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* simcu::websocket.server —— 服务端单条 WebSocket 连接。
|
||||
*
|
||||
* 由 WebSocketServer 在握手成功后创建并交给匹配的 IWebsocketHandler。
|
||||
* 由 WebSocketServer 在握手成功后创建并交给匹配的 WebSocketHandler。
|
||||
* 提供 send(三重重载:WebSocketMessage / String / Array<Byte>)/ ping / close / terminate,以及只读属性
|
||||
* connectionId / readyState / remoteAddress / requestPath / requestQuery。
|
||||
*/
|
||||
@@ -21,7 +21,7 @@ import simcu::websocket.common.WebSocketException
|
||||
/// 服务端单条 WebSocket 连接(由对应 handler 处理回调)。
|
||||
public class WebSocketConnection {
|
||||
private let parent: ?WebSocketServer
|
||||
private let handler: IWebsocketHandler
|
||||
private let handler: WebSocketHandler
|
||||
private let frame: FrameStream
|
||||
private let stateLock = Mutex()
|
||||
private var state: ReadyState = ReadyState.Open
|
||||
@@ -40,7 +40,7 @@ public class WebSocketConnection {
|
||||
public let requestQuery: String
|
||||
|
||||
/// 回调归属的 handler(由 WebSocketServer 按路径匹配后注入)。
|
||||
internal prop wsHandler: IWebsocketHandler {
|
||||
internal prop wsHandler: WebSocketHandler {
|
||||
get() { handler }
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ public class WebSocketConnection {
|
||||
get() { parent }
|
||||
}
|
||||
|
||||
internal init(parent: ?WebSocketServer, handler: IWebsocketHandler, frame: FrameStream,
|
||||
internal init(parent: ?WebSocketServer, handler: WebSocketHandler, frame: FrameStream,
|
||||
connId: Int64, requestPath: String, requestQuery: String) {
|
||||
this.parent = parent
|
||||
this.handler = handler
|
||||
|
||||
@@ -11,7 +11,7 @@ package simcu::websocket.server
|
||||
import simcu::websocket.common.WebSocketMessage
|
||||
|
||||
/// WebSocket 服务端 handler 接口(多 handler 按注册路径路由)。
|
||||
public interface IWebsocketHandler {
|
||||
public interface WebSocketHandler {
|
||||
/// 握手成功、连接建立后触发。
|
||||
func onConnect(conn: WebSocketConnection): Unit
|
||||
|
||||
@@ -32,7 +32,7 @@ import simcu::websocket.common.WebSocketException
|
||||
public class WebSocketServer {
|
||||
private let bindPort: UInt16
|
||||
private let maxPayload: Int64
|
||||
private var pathFactories = HashMap<String, () -> IWebsocketHandler>()
|
||||
private var pathFactories = HashMap<String, () -> WebSocketHandler>()
|
||||
private var serverSock: ?TcpServerSocket = None
|
||||
private var running = false
|
||||
private var connections = HashMap<Int64, WebSocketConnection>()
|
||||
@@ -50,7 +50,7 @@ public class WebSocketServer {
|
||||
/// 注册一个 handler 工厂并绑定到端点路径(多 handler 按路径路由)。
|
||||
/// 每次握手成功都会调用工厂创建一个新的 handler 实例(每连接一个),
|
||||
/// 因此不要在工厂里复用有状态对象(如 scoped 服务),应让各回调按需现场解析。
|
||||
public func addHandler(path: String, factory: () -> IWebsocketHandler): Unit {
|
||||
public func addHandler(path: String, factory: () -> WebSocketHandler): Unit {
|
||||
pathFactories[path] = factory
|
||||
}
|
||||
|
||||
@@ -212,7 +212,7 @@ public class WebSocketServer {
|
||||
// ===== 监听与握手 =====
|
||||
|
||||
/// 按请求路径匹配 handler 工厂。无匹配返回 None。
|
||||
private func findFactory(path: String): ?() -> IWebsocketHandler {
|
||||
private func findFactory(path: String): ?() -> WebSocketHandler {
|
||||
pathFactories.get(path)
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ import simcu::websocket.client.WebSocketClient
|
||||
import simcu::websocket.common.MessageType
|
||||
import simcu::websocket.common.WebSocketException
|
||||
import simcu::websocket.common.WebSocketMessage
|
||||
import simcu::websocket.server.IWebsocketHandler
|
||||
import simcu::websocket.server.WebSocketHandler
|
||||
import simcu::websocket.server.WebSocketConnection
|
||||
import simcu::websocket.server.WebSocketServer
|
||||
|
||||
@@ -48,7 +48,7 @@ private func waitUntil(timeoutMs: Int64, condition: () -> Bool): Bool {
|
||||
}
|
||||
|
||||
/// 测试用 handler:把事件回调逻辑收进接口方法,行为写入 harness。
|
||||
class TestWsHandler <: IWebsocketHandler {
|
||||
class TestWsHandler <: WebSocketHandler {
|
||||
let harness: WsTestHarness
|
||||
|
||||
init(harness: WsTestHarness) {
|
||||
@@ -77,7 +77,7 @@ class TestWsHandler <: IWebsocketHandler {
|
||||
}
|
||||
|
||||
/// 广播场景:harness1 收到广播后转发文本。
|
||||
class EchoHandler <: IWebsocketHandler {
|
||||
class EchoHandler <: WebSocketHandler {
|
||||
let harness: WsTestHarness
|
||||
|
||||
init(harness: WsTestHarness) {
|
||||
@@ -102,7 +102,7 @@ class EchoHandler <: IWebsocketHandler {
|
||||
}
|
||||
|
||||
/// 服务端主动关闭场景:连接建立后立即 close。
|
||||
class CloseOnConnectHandler <: IWebsocketHandler {
|
||||
class CloseOnConnectHandler <: WebSocketHandler {
|
||||
init() {}
|
||||
|
||||
public override func onConnect(conn: WebSocketConnection): Unit {
|
||||
@@ -123,7 +123,7 @@ class CloseOnConnectHandler <: IWebsocketHandler {
|
||||
}
|
||||
|
||||
/// 分组场景:连接建立后加入 "room" 组,便于验证组播/单播。
|
||||
class GroupJoinHandler <: IWebsocketHandler {
|
||||
class GroupJoinHandler <: WebSocketHandler {
|
||||
public override func onConnect(conn: WebSocketConnection): Unit {
|
||||
conn.joinGroup("room")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user