我有一个非常简单的 WebSocket 服务器:
class WsServer {
WsServer();
void runServer(int port) {
ConnectionsHandler connectionsHandler = new ConnectionsHandler();
HttpServer
.bind('127.0.0.1', port)
.then((HttpServer server) {
print('listening for connections on $port');
var sc = new StreamController();
sc.stream.transform(new WebSocketTransformer()).listen(connectionsHandler.onConnection);
server.listen((HttpRequest request) {
if (request.uri.path == '/ws') {
sc.add(request);
}
// we dont deal static files
});
},
onError: (error) => print("Error starting HTTP server: $error"));
}
}
class ConnectionsHandler {
List<WebSocket> connections = new List<WebSocket>();
ConnectionsHandler();
void onConnection(WebSocket conn) {
print('new ws conn');
connections.add(conn);
conn.listen(
onMessage,
onDone: () => connections.remove(conn),
onError: (e) => connections.remove(conn)
);
}
void onMessage(message) {
print('new ws msg: $message');
}
}
我需要在ConnectionsHandler
中获取request.session
。 WebSocketTransformer
似乎仅发送WebSocket
连接,该连接无法通过 session 访问原始HttpRequest
。
有没有办法从 websocket 处理程序本身访问 session 数据?即使客户端从 cookie 发送 dart session id,那么如何检索和刷新 HttpSession?
最佳答案
您也许可以让它工作,但如果 Web 套接字连接使用与普通 HTTP 请求相同的源,您只能看到 cookie,从而看到 session 。
请注意,WebSocketTransformer
不必在流中使用。您一次可以升级一个请求。
你能试试下面的代码吗?
import 'dart:io';
import 'dart:async';
class WsServer {
WsServer();
void runServer(int port) {
ConnectionsHandler connectionsHandler = new ConnectionsHandler();
HttpServer
.bind('127.0.0.1', port)
.then((HttpServer server) {
print('listening for connections on $port');
var connHandler = new ConnectionsHandler();
var webSocketTransformer = new WebSocketTransformer();
server.listen((HttpRequest request) {
if (request.uri.path == '/ws') {
webSocketTransformer.upgrade(request)
.then((WebSocket ws) {
connHandler.onConnection(ws, request);
});
// TODO handle error from update
}
// we dont deal static files
});
},
onError: (error) => print("Error starting HTTP server: $error"));
}
}
class ConnectionsHandler {
List<WebSocket> connections = new List<WebSocket>();
ConnectionsHandler();
void onConnection(WebSocket conn, HttpRequest req) {
print('new ws conn');
connections.add(conn);
conn.listen(
(message) {
print('new ws msg: $message and ${req.session.keys}');
},
onDone: () => connections.remove(conn),
onError: (e) => connections.remove(conn)
);
}
}
main() {
var server = new WsServer();
server.runServer(3000);
}
关于session - 如何从 Dart HttpServer WebSocket 访问 HttpSession 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16042953/