* demos/chat.tcl: Sample Tk chat app using multicast udp.
authorpatthoyts <patthoyts>
Tue, 23 Nov 2004 13:39:29 +0000 (13:39 +0000)
committerpatthoyts <patthoyts>
Tue, 23 Nov 2004 13:39:29 +0000 (13:39 +0000)
ChangeLog
demos/chat.tcl [new file with mode: 0644]

index c1ec4b83ab3e739d614ff4015ea42cb34d729f6c..e46f69345fff8491b0212dac07f1cd6ff05feeac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
+2004-11-23  Pat Thoyts  <patthoyts@users.sourceforge.net>
+
+       * demos/chat.tcl: Sample Tk chat app using multicast udp.
+
 2004-11-22  Pat Thoyts  <patthoyts@users.sourceforge.net>
 
+       * TAG:          ====  tcludp-1_0_6 ====
+       
        * win/makefile.vc: Improved the win build system.
        * demos/*: Added a few sample applications, demos of broadcast, 
        multicast and normal operation.
diff --git a/demos/chat.tcl b/demos/chat.tcl
new file mode 100644 (file)
index 0000000..acef698
--- /dev/null
@@ -0,0 +1,68 @@
+# chat.tcl - Copyright (C) 2004 Pat Thoyts <patthoyts@users.sourceforge.net>
+#
+# This is a sample application from TclUDP.
+#
+# This illustrates the use of multicast UDP messages to implement a primitive chat
+# application.
+#
+# $Id$
+
+package require Tk  8.4
+package require udp 1.0.6
+
+variable Address  224.5.1.21
+variable Port     7771
+
+proc Receive {sock} {
+    set pkt [read $sock]
+    set peer [fconfigure $sock -peer]
+    AddMessage $peer $pkt
+    return
+}
+
+proc Start {addr port} {
+    set s [udp_open $port]
+    fconfigure $s -blocking 0 -buffering none -translation binary \
+        -mcastadd $addr -remote [list $addr $port]
+    fileevent $s readable [list ::Receive $s]
+    return $s
+}
+
+proc CreateGui {socket} {
+    text .t -yscrollcommand {.s set}
+    scrollbar .s -command {.t yview}
+    frame .f -border 0
+    entry .f.e -textvariable ::_msg
+    button .f.ok -text Send -underline 0 -command "SendMessage $socket \$::_msg"
+    button .f.ex -text Exit -underline 1 -command {destroy .}
+    pack .f.ex .f.ok -side right
+    pack .f.e -side left -expand 1 -fill x
+    grid .t .s -sticky news
+    grid .f -  -sticky ew
+    grid columnconfigure . 0 -weight 1
+    grid rowconfigure . 0 -weight 1
+    bind .f.e <Return> {.f.ok invoke}
+    .t tag configure CLNT -foreground red
+}
+
+proc SendMessage {sock msg} {
+    puts -nonewline $sock $msg
+}
+
+proc AddMessage {client msg} {
+    set msg [string map [list "\r\n" "" "\r" "" "\n" ""] $msg]
+    set client [lindex $client 0]
+    if {[string length $msg] > 0} {
+        .t insert end "$client " CLNT "$msg\n" MSG
+    }
+}
+
+if {!$tcl_interactive} {
+    set sock [Start $Address $Port]    
+    CreateGui $sock
+    after idle [list SendMessage $sock "$::tcl_platform(user)@[info hostname] connected"]
+    tkwait window .
+    close $sock
+    exit 0
+}
+