使用Dart WebSocket服务器支持WebSocket关闭原因

使用Dart WebSocket服务器支持WebSocket关闭原因,websocket,dart,Websocket,Dart,我正在使用Dart的WebSocket类(Dart:io和Dart:html版本)连接到Dart WebSocket服务器。当我让客户端使用自定义关闭代码和原因关闭web套接字连接时,自定义代码设置正确,但自定义关闭原因设置不正确 下面是一个简化的测试用例: server.dart library server; import 'dart:io'; main() async { HttpServer server = await HttpServer.bind('localhost',

我正在使用Dart的WebSocket类(Dart:io和Dart:html版本)连接到Dart WebSocket服务器。当我让客户端使用自定义关闭代码和原因关闭web套接字连接时,自定义代码设置正确,但自定义关闭原因设置不正确

下面是一个简化的测试用例:

server.dart

library server;

import 'dart:io';

main() async {
  HttpServer server = await HttpServer.bind('localhost', 8081);
  server
      .transform(new WebSocketTransformer())
      .listen((WebSocket webSocket) {
    print('WebSocket opened.');
    webSocket.listen((_) {}, onDone: () {
      print('WebSocket closed.');
    });
  });
  print('Listening..');
}
library test;

import 'dart:io';

main() async {
  WebSocket webSocket1 = await WebSocket.connect('ws://localhost:8081');
  webSocket1.listen((_) {}, onDone: () {
    print('Local Dart ws connection: closed with\n\t' +
          'code: ${webSocket1.closeCode}\n\t' +
          'reason: ${webSocket1.closeReason}');
  });
  webSocket1.close(4001, 'Custom close reason.');

  WebSocket webSocket2 = await WebSocket.connect('ws://echo.websocket.org');
  webSocket2.listen((_) {}, onDone: () {
    print('echo.websocket.org connection: closed with\n\t' +
          'code: ${webSocket2.closeCode}\n\t' +
          'reason: ${webSocket2.closeReason}');
  });
  webSocket2.close(4001, 'Custom close reason.');
}
Local Dart ws connection: closed with
    code: 4001
    reason:
echo.websocket.org connection: closed with
    code: 4001
    reason: Custom close reason.
测试.省道

library server;

import 'dart:io';

main() async {
  HttpServer server = await HttpServer.bind('localhost', 8081);
  server
      .transform(new WebSocketTransformer())
      .listen((WebSocket webSocket) {
    print('WebSocket opened.');
    webSocket.listen((_) {}, onDone: () {
      print('WebSocket closed.');
    });
  });
  print('Listening..');
}
library test;

import 'dart:io';

main() async {
  WebSocket webSocket1 = await WebSocket.connect('ws://localhost:8081');
  webSocket1.listen((_) {}, onDone: () {
    print('Local Dart ws connection: closed with\n\t' +
          'code: ${webSocket1.closeCode}\n\t' +
          'reason: ${webSocket1.closeReason}');
  });
  webSocket1.close(4001, 'Custom close reason.');

  WebSocket webSocket2 = await WebSocket.connect('ws://echo.websocket.org');
  webSocket2.listen((_) {}, onDone: () {
    print('echo.websocket.org connection: closed with\n\t' +
          'code: ${webSocket2.closeCode}\n\t' +
          'reason: ${webSocket2.closeReason}');
  });
  webSocket2.close(4001, 'Custom close reason.');
}
Local Dart ws connection: closed with
    code: 4001
    reason:
echo.websocket.org connection: closed with
    code: 4001
    reason: Custom close reason.
stdout

library server;

import 'dart:io';

main() async {
  HttpServer server = await HttpServer.bind('localhost', 8081);
  server
      .transform(new WebSocketTransformer())
      .listen((WebSocket webSocket) {
    print('WebSocket opened.');
    webSocket.listen((_) {}, onDone: () {
      print('WebSocket closed.');
    });
  });
  print('Listening..');
}
library test;

import 'dart:io';

main() async {
  WebSocket webSocket1 = await WebSocket.connect('ws://localhost:8081');
  webSocket1.listen((_) {}, onDone: () {
    print('Local Dart ws connection: closed with\n\t' +
          'code: ${webSocket1.closeCode}\n\t' +
          'reason: ${webSocket1.closeReason}');
  });
  webSocket1.close(4001, 'Custom close reason.');

  WebSocket webSocket2 = await WebSocket.connect('ws://echo.websocket.org');
  webSocket2.listen((_) {}, onDone: () {
    print('echo.websocket.org connection: closed with\n\t' +
          'code: ${webSocket2.closeCode}\n\t' +
          'reason: ${webSocket2.closeReason}');
  });
  webSocket2.close(4001, 'Custom close reason.');
}
Local Dart ws connection: closed with
    code: 4001
    reason:
echo.websocket.org connection: closed with
    code: 4001
    reason: Custom close reason.
第一个web套接字(连接到本地Dart服务器的套接字)连接并关闭,但缺少关闭原因(空白字符串)。第二个web套接字(连接到echo.websocket.org的套接字)连接并关闭,并且关闭代码和原因设置正确


客户机的连接方式不会有问题,因为这两种情况都是相同的。那么,我设置Dart WebSocket的方式有问题吗?或者它是WebSocketTransformer/WebSocket类中的一个bug?

这已通过添加dart lang/sdk解决: