用插座学习TCL在本地机器上设置回声服务器



我是TCL的新手,正在尝试一本名为《实用编程》的书中的一个例子。

我正在尝试连接到具有同一文件中的客户端的echo服务器。因此,我制作了一个名为EchoServer.tclsh的文件。然后,我在其中编写了echo服务器代码和echoclient代码。当我运行这个时,我收到一个错误,显示:

couldn't open socket: connection refused
    while executing
"socket $host $port"
    (procedure "Echo_Client" line 2)
    invoked from within
"Echo_Client localhost 2540"
    invoked from within
"set s [Echo_Client localhost 2540]"
    (file "echo_server.tcl" line 35)

服务器的代码是:

proc Echo_server {port} {
        global echo
        set echo(main) {socket -server EchoAccept $port}
}
proc EchoAccept {sock addr port} {
        global echo
        puts "Accept $sock from $addr port $port"
        set echo(addr,$sock) [list $addr $port]
        f configure $sock -buffering line
        fileevent $sock readable [list Echo $sock]
}
proc Echo {sock} {
        global echo
        if {[eof $sock] || [catch {gets $sock line}]} {
                # end of file or abnormal connection drop
                 close $sock
                 puts "Close $echo(addr,$sock)"
                 unset echo(addr,$sock)
} else {
        if {[string compare $line "quit"] ==0} {
        # Prevent new connections. 
                # Existing connections stay open. 
        close $echo(main)
}
puts $sock $line
}
}

客户端的代码是:

proc Echo_Client {host port} {
        set s [socket $host $port]
        fconfigure $s -buffering line
        return $s
}
set s [Echo_Client localhost 2540]
        puts $s "Hello!"
        gets $s

set echo(main) {socket -server EchoAccept $port}

应该是

set echo(main) [socket -server EchoAccept $port]

通过进入事件循环

vwait forever

在结束时

最新更新