Dart如何编写简单的Web套接字回显应用程序

Nat*_*ood 4 websocket dart dart-editor dart-webui

我一直在尝试学习足够的html,css和Dart来创建我的第一个网页,一切顺利,除了我不明白如何创建一个简单的页面和服务器端的Web套接字服务器,它只会回显回来了.我发现的示例倾向于说明其他Dart工具,并连接到网络上的echo服务器或做其他使他们的代码对于新手不简单的事情.

我试图将Seth Ladd的例子 "dart-example-web-sockets-client" 简化为"最好"的例子.我可以收到从页面发送的内容,重新打包并认为我将其发送回去,但网页上绝对没有任何反应.我通过单击从Dart编辑器内部运行Web服务器时返回的URL来启动页面.由于页面不是,AFAIK,在调试器中运行,我在诊断错误时受到阻碍.

以下是Seth服务器的简化代码:

void handleEchoWebSocket(WebSocket webSocket) {
log.info('New WebSocket connection');

// Listen for incoming data. We expect the data to be a JSON-encoded String.
webSocket
  .map((string) => JSON.decode(string))
  .listen((json) {
    // The JSON object should contain a 'request' entry.
     var request = json['request'];
     switch (request) {
       case 'search':  
         var input = json['input'];
         log.info("Received request '$request' for '$input'");
         var response = {
           'response': request,
           'input': input,
      };
      webSocket.add(JSON.encode(response)); // can't detect page receiving this.
      log.info("Echoed request..$request $input"); // correct data
      break;

    default:
      log.warning("Invalid request: '$request'");
      }
    }, onError: (error) {
  log.warning('Bad WebSocket request');
  });
}
Run Code Online (Sandbox Code Playgroud)

此示例使用用户输入作为两个搜索引擎的输入,打包结果并将它们返回到页面以便即时创建新的DOM元素.

我只需要指出一个简单的例子来回应提交的内容.

gro*_*hjy 9

这是一个简单的websocket客户端/服务器回显示例.消息不会显示在浏览器窗口中,但会在控制台窗口中打印.您必须分别启动server.dart和main.dart.两个进程都将消息打印到自己的控制台窗口.编辑:我添加了一个输出div,用于在浏览器中显示消息.

BIN\ws_server.dart:

import "dart:convert";
import 'dart:io';
import 'package:route/server.dart' show Router;



void handleWebSocket(WebSocket webSocket) {
  // Listen for incoming data. We expect the data to be a JSON-encoded String.
  webSocket
    .map((string)=> JSON.decode(string))
    .listen((json) {
      // The JSON object should contains a 'echo' entry.
      var echo = json['echo'];
      print("Message to be echoed: $echo");
      var response='{"response": "$echo"}';
      webSocket.add(response);
    }, onError: (error) {
      print('Bad WebSocket request');
    });
}


void main() {
  int port = 9223;

  HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, port).then((server) {
    print("Search server is running on "
             "'http://${server.address.address}:$port/'");
    var router = new Router(server);
    // The client will connect using a WebSocket. Upgrade requests to '/ws' and
    // forward them to 'handleWebSocket'.
    router.serve('/ws')
      .transform(new WebSocketTransformer())
      .listen(handleWebSocket);
  });
}
Run Code Online (Sandbox Code Playgroud)

网络\ index.html在:

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
    <title>Websocket echo</title>
  </head>
  <body>
    <p>Websocket test</p>
    <div id="output"></div>

    <script type="application/dart" src="main.dart"></script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

网络\ main.dart:

library main;

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

class WebsocketService {

  WebSocket webSocket;

  WebsocketService() {
    connect();
  }

  void connect() {
    webSocket = new WebSocket('ws://127.0.0.1:9223/ws');
    webSocket.onOpen.first.then((_) {
      onConnected();
      sendws("Hello websocket server");
      webSocket.onClose.first.then((_) {
        print("Connection disconnected to ${webSocket.url}");
        onDisconnected();
      });
    });
    webSocket.onError.first.then((_) {
      print("Failed to connect to ${webSocket.url}. "
            "Please run bin/server.dart and try again.");
      onDisconnected();
    });
  }

  void onConnected() {
    webSocket.onMessage.listen((e) {
      onMessage(e.data);
    });
  }

  void onDisconnected() {
    print("Disconnected, trying again in 3s");
    new Timer(new Duration(seconds:3), (){
      connect();
    });
  }

  void onMessage(data) {
    var json = JSON.decode(data);
    var echoFromServer = json['response'];
    print("Received message: $echoFromServer");
    var output=querySelector('#output');
    output.text="Received message: $echoFromServer";

    new Timer(new Duration(seconds:3), (){ //Send a new message to server after 3s
      String now = new DateTime.now().toString();
      sendws("Time: $now");
    });

  }

  void sendws(String msg){
    var request = '{"echo": "$msg"}';
    print("Send message to server: $request");
    webSocket.send(request);
  }
}

void main() {
  WebsocketService ws=new WebsocketService();
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案现在已经过时了,因为 Dart 包“路线”已经停止。这个堆栈溢出答案有一个更好的 websocket 服务器实现:/sf/answers/3681376471/ 如果你只是想测试服务器,你可以使用此页面上的浏览器 bsed websocket 客户端 https:// www.websocket.org/echo.html (2认同)