blog.monophile.net

Takaaki Yamamoto

東京工業大学において計算機科学と応用数学を学び、 情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 digitiminimi Inc. において、インフラエンジニアとして生計をたててている。

各種環境の構築と管理を承ります。

  • 仮想環境: Openstack, GCP, AWS, Azure, ...
  • アプリケーション: WordPress, GitLab, Redmine, ...

List

DartでWebSocket

今、webサーバからプッシュ通知が来るようなwebアプリを書いています。 XMLHttpRequestとJavaScriptが好きじゃないので、どうしようかな、と思っていたので、 DartとWebSocketを使ってみることにしました。

sample

単純にクライアントが書いたことをそのまま返すサーバを書きました。 追加のパッケージはrouteです。

client.dart
import 'dart:io';

const String ws_srv_addr = 'ws://127.0.0.1:60000/';
void onMessage (String message) => print(message);
void connectionClosed() => print('Connection to $ws_srv_addr closed');

void main(List args) {
  WebSocket ws;
  WebSocket.connect(ws_srv_addr).then((WebSocket socket) {
    ws = socket;
    ws.listen(onMessage, onDone: connectionClosed);
  });
  onInput(List input) => ws.add(new String.fromCharCodes(input).trim());
  stdin.listen(onInput);
}
server.dart
import 'dart:io';
import 'package:route/server.dart' show Router;

const String saddr = '127.0.0.1';
const int sport = 60000;

echo(WebSocket ws) => (string) => ws.add(string);
handler(WebSocket ws) => ws.listen(echo(ws), onError: (e) => print(e));

void main() {
  HttpServer.bind(saddr, sport).then((server) {
    print("server " "'http://${server.address.address}:$sport/'");
    var router = new Router(server);
    router.serve('/').transform(new WebSocketTransformer()).listen(handler);
  });
}

実行

以下のようにserverを起動してからclientを立ち上げるのみです。 標準入力を受け取り、そのままの文字が返ってきます。

$ dart server.dart &
$ dart client.dart

参考URL