2014-01-05 2 views
1

У меня есть следующий код на стороне клиента: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 не запускаются. Я подозреваю, что мне что-то не хватает, но не знаю, что.

ответ

2

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

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

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, похожий на экземпляр на стороне клиента.

Смежные вопросы