使用 Dart 建立 WebSocket 連線

伺服端

新增 server.dart 檔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import 'dart:io' show HttpRequest, HttpServer, WebSocket, WebSocketTransformer;
import 'dart:convert' show json;

void main() {
// 建立服務
HttpServer.bind('localhost', 8000).then((HttpServer server) {
print('WebSocket listening on ws://localhost:8000/');
server.listen((HttpRequest request) {
// 升級協定
WebSocketTransformer.upgrade(request).then((WebSocket ws) {
ws.listen(
(data) {
// 檢查狀態
if (ws.readyState == WebSocket.open) {
print('Recieved from client: ${json.decode(data)}');
// 發送消息
ws.add(data);
}
},
onDone: () => print('Done'),
onError: (err) => print(err),
cancelOnError: true,
);
}, onError: (err) => print(err));
}, onError: (err) => print(err));
}, onError: (err) => print(err));
}

執行。

1
dart server.dart

客戶端

新增 client.dart 檔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import 'dart:io' show WebSocket;
import 'dart:convert' show json;
import 'dart:async' show Timer;

main() {
// 建立連線
WebSocket.connect('ws://localhost:8000').then((WebSocket ws) {
// 檢查狀態
if (ws.readyState == WebSocket.open) {
// 發送消息
ws.add(json.encode({
'data': 'Hello',
}));
}
ws.listen(
(data) {
// 檢查狀態
if (ws.readyState == WebSocket.open) {
print('Recieved from server: ${json.decode(data)}');
// 發送消息
Timer(Duration(seconds: 1), () {
ws.add(data);
});
}
},
onDone: () => print('Done'),
onError: (err) => print(err),
cancelOnError: true,
);
}, onError: (err) => print(err));
}

執行。

1
dart client.dart

程式碼

參考資料