// server.dart
import 'dart:io';
import 'dart:convert';
class ChatRoom {
int key = 0;
static int sn = 0;
static Map<int, Socket> sockets = { };
void broadcast(List<int> data) {
sockets.forEach((id, session) {
if (key != id) session.add(utf8.encode('id$key:>${utf8.decode(data)}'));
});
}
void relay(List<int> data) async {
String text = utf8.decode(data).trim();
if (text == 'quit') {
print('relay: $text');
final session = sockets.remove(key);
await session?.close();
}
broadcast(data);
}
void shutdown( ) {
sockets.remove(key);
broadcast(utf8.encode('bye!\n'));
print('id$key leave, remain ${sockets.length}');
}
ChatRoom (Socket session) {
key = ++sn;
session .. add(utf8.encode('id${key} welcome!\n')) .. listen(
relay,
onDone: shutdown,
onError: (_) => session.close()
);
sockets[key] = session;
print('id$key join [total ${sockets.length}]');
}
}
void main( ) {
int port = 8080;
print("Chat room at $port");
ServerSocket.bind(InternetAddress.anyIPv4, port).then((ServerSocket server) {
server.listen((socket) => ChatRoom(socket));
});
}
使用 dart VM 來跑: dart server.dart, 之後就可以用 telnet 127.0.0.1 8080 讓客戶端連進聊天室, 只是 linux 上的 telnet client 在中文編/解碼上, 雖然接收時解中文碼沒問題, 但傳送時編成的中文碼可能會有問題, 幸好用 dart 語言編寫相同功能的 telnet 終端機不是難事:
// client.dart
import 'dart:io';
import 'dart:convert';
void main(List<String> args) async {
String ip = (args.length > 0) ? args[0] : 'localhost';
int port = (args.length > 1) ? int.parse(args[1]) : 8080;
Socket session = await Socket.connect(ip, port);
session.listen (
(dynamic data) => print((data is String) ? data : utf8.decode(data).trim()),
onDone: ( ) => exit(0),
onError: (_) => session.close()
);
stdin.listen (
(List<int> data) {
try {// print(data);
if (utf8.decode(data).trim() == 'quit') throw 'user quit';
else session.add(data);
} catch(e) {
print('stdin: $e, $data');
session.close();
exit(0);
}
}
);
}
同樣用 dart VM 來跑: dart client.dart
2022年11月27日 星期日
用 dart 語言寫簡單的 SocketServer 聊天室
訂閱:
張貼留言 (Atom)
Linux mint 玩 waydroid 一些心得
1. 目前使用 linux mint 22.1 作業系統可以順利跑起來, 可上官網去下載, 並安裝到硬碟. 2. 安裝 waydroid 可上網站 https://docs.waydro.id 參考看看: https://docs.waydro.id/usage/inst...
-
1. 上 Firebase 網站 註冊啟用 Firebase : https://firebase.google.com/ 2. 進入 Firebase Console 註冊開啟新專案 : https://console.firebase.google.com/...
-
Flutter 讓人很容易短時間就能開發出 app, 關鍵在於他開發了很多種小部件稱為 Widget, 將Widget 組合起來就是一個 app. 所謂 部 件(Widget)就是一個可以呈現在螢幕上的視覺系 物 件,幾乎可以說 Flutter 每個物件都是 部 件. 開發者透...
沒有留言:
張貼留言