From ff9ca9d0f87511fabef209cadce08d68960ae214 Mon Sep 17 00:00:00 2001 From: adam Date: Wed, 2 May 2012 23:29:58 -0700 Subject: [PATCH] first commit --- ChatClient/ChatClient.dart | 75 ++++++++++++++++++++++++++++++++++++++ ChatClient/ChatClient.html | 55 ++++++++++++++++++++++++++++ README.md | 4 ++ chatWebsocketDart.dart | 71 ++++++++++++++++++++++++++++++++++++ 4 files changed, 205 insertions(+) create mode 100644 ChatClient/ChatClient.dart create mode 100644 ChatClient/ChatClient.html create mode 100644 README.md create mode 100644 chatWebsocketDart.dart diff --git a/ChatClient/ChatClient.dart b/ChatClient/ChatClient.dart new file mode 100644 index 0000000..bd8540f --- /dev/null +++ b/ChatClient/ChatClient.dart @@ -0,0 +1,75 @@ +#import('dart:html'); +#import('dart:json'); + +class ChatClient { + WebSocket ws; + bool isConnected = false; + InputElement _messageInput; + InputElement _nicknameInput; + + ChatClient() { + } + + // Send nickname to server + sendNick() { + var name = _nicknameInput.value; + ws.send(JSON.stringify({"cmd": "setnick", "args": name})); + } + + // Server sets nickname + setNick(nick) { + _nicknameInput.value = nick; + } + + // Send the server a message + sendMessage() { + String message = _messageInput.value; + if (!message.isEmpty()) { + ws.send(JSON.stringify({"cmd": "sendmessage", "args": message})); + _messageInput.value = ""; + } + } + + void run() { + _messageInput = document.query("#message"); + _messageInput.on.keyPress.add((key) { + if (key.charCode == 13) { // Enter + sendMessage(); + } + }); + _nicknameInput = document.query("#nickname"); + _nicknameInput.on.keyPress.add((key) { + if (key.charCode == 13) { // Enter + sendNick(); + } + }); + + ws = new WebSocket("ws://127.0.0.1:8000/ws"); + ws.on.open.add((a) { + print("open $a"); + isConnected = true; + }); + + ws.on.close.add((c) { + print("close $c"); + isConnected = false; + }); + + ws.on.message.add((m) { + var jdata = JSON.parse(m.data); + if (jdata["cmd"] == "serversetnick") { + setNick(jdata["args"]); + } else if (jdata["cmd"] == "newmessage") { + displayMessage(jdata["args"]); + } + }); + } + + void displayMessage(String message) { + document.query('#status').innerHTML = "${document.query('#status').innerHTML}
$message"; + } +} + +void main() { + new ChatClient().run(); +} diff --git a/ChatClient/ChatClient.html b/ChatClient/ChatClient.html new file mode 100644 index 0000000..5217a25 --- /dev/null +++ b/ChatClient/ChatClient.html @@ -0,0 +1,55 @@ + + + + + Websocket Chat Client + + + + +

Websocket Chat Client

+ +
+
+
name:
+
+
+ + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..ecaaa30 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +Example Chat Client/Server with Websockets in Dart +================================================== + +Super simple example of how to use websockets in dart on both client and server side. Sample provides a very simple chat server and client implementation. The server sets a default nickname on established connection which the client can then change. Entering the client nick and pressing `Enter` key will change it on the server and client. Entering in text into the bottom chat window and pressing `Enter` will send the text to all the clients connected. diff --git a/chatWebsocketDart.dart b/chatWebsocketDart.dart new file mode 100644 index 0000000..74f4b33 --- /dev/null +++ b/chatWebsocketDart.dart @@ -0,0 +1,71 @@ +#import('dart:io'); +#import('dart:json'); + +Map connections; +List chatText; + +class ClientNick { + int token; + String name; + WebSocketConnection conn; + + ClientNick(this.name, this.token, this.conn) { + conn.send(JSON.stringify({"cmd":"serversetnick", "args":this.name})); + conn.onMessage = (message) { + print("message is $message"); + var jdata = JSON.parse(message); + if (jdata["cmd"] == "setnick") { + if (name == jdata["args"]) { + return; + } + var oldname = name; + name = jdata["args"]; + print("setting nick $name"); + connections.forEach((k,v) { + v.conn.send(JSON.stringify({"cmd":"newmessage", "args": '${oldname} has changed name to ${name}'})); + }); + print(connections); + } else if (jdata["cmd"] == "sendmessage") { + chatText.add(jdata["args"]); + print("message: ${jdata["args"]}"); + connections.forEach((k,v) { + v.conn.send(JSON.stringify({"cmd":"newmessage", "args": '${name} : ${jdata["args"]}'})); + }); + } + }; + + conn.onClosed = (int status, String reason) { + print('closed with $status for $reason'); + connections.remove(token.toString()); + }; + + conn.onError = (e) { + print('Error was $e'); + connections.remove(token.toString()); + }; + } + + String toString() { + return "${name}_${token}"; + } +} + +void main() { + chatText = []; + int token = 0; + connections = new Map(); + + HttpServer server = new HttpServer(); + WebSocketHandler wsHandler = new WebSocketHandler(); + server.addRequestHandler((req) => req.path == "/ws", wsHandler.onRequest); + + wsHandler.onOpen = (WebSocketConnection conn) { + token+=1; + var c = new ClientNick("new_nick_${token}", token, conn); + print("adding connection token = ${token}"); + connections[token.toString()] = c; + }; + + print('listing on localhost'); + server.listen('127.0.0.1', 8000); +} \ No newline at end of file