Dart WebSocket не запускает события onOpen или onMessage?

У меня есть следующий клиентский код:

import 'dart:html';
import 'dart:async';

void main() {
  WebSocket ws = new WebSocket('ws://127.0.0.1:4949');
  ws.onOpen.listen((_) => print('open'));
  ws.onMessage.listen((MessageEvent e) => print(e.data));
  ws.onClose.listen((_) => print('closed'));
  ws.onError.listen((_) => print('error'));
}

И этот серверный код:

import 'dart:io';
import 'dart:async';

main() {
  ServerSocket.bind('127.0.0.1', 4949).then((ServerSocket server) {
    server.listen((Socket client){
      print('Connection from '
          '${client.remoteAddress.address}:${client.remotePort}');
      client.write('hello from server');
    });
  });
}

Соединение WebSocket успешно подключается к ServerSocket. Код сервера печатает:

Connection from 127.0.0.1:55516
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1:4949
Origin: http://127.0.0.1:3030
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: PrJr2iVElmEsX7ZItHnWHA==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.39 (Dart) Safari/537.36

Проблема в том, что onOpen и onMessage не срабатывают. Я подозреваю, что что-то упускаю, но не уверен, что.


person Nawaf Alsulami    schedule 05.01.2014    source источник


Ответы (1)


Да, вы что-то упускаете, полную реализацию на стороне сервера. ServerSocket — это обычный сокет, используемый для TCP (или UDP).

Но для веб-сокета требуется HTTP-сервер, который обрабатывает HTTP-запрос и обновляет соединение до соединения с веб-сокетом:

import 'dart:io';

void main() {

  HttpServer.bind('127.0.0.1', port)
    .then((HttpServer server) {
      print('listening for connections on $port');

      server.listen((HttpRequest request) {
        if (request.uri.path == '/ws') {
          WebSocketTransformer.upgrade(request).then((WebSocket websocket) {
            websocket.listen((message) => print('Message from client'));
            print('Client connected');
          });
        } else {
          /* ... */
        }
      });
    },
    onError: (error) => print("Error starting HTTP server: $error"));
}

Простой пример из SethLadd. Но я бы, вероятно, также проверил правильность заголовков запросов CONNECTION и UPGRADE перед обновлением до веб-сокета. После обновления соединения у вас есть экземпляр Websocket, который аналогичный на одной стороне клиента.

person Fox32    schedule 05.01.2014