使用套接字学习TCL在本地机器上设置echo服务器

使用套接字学习TCL在本地机器上设置echo服务器,tcl,Tcl,我是TCL的新手,在《实用编程》一书中尝试了一个例子 我正在尝试使用同一文件中的客户端连接到echo服务器。因此,我创建了一个名为EchoServer.tclsh的文件。然后,我在其中编写了echo服务器代码和echoclient代码。运行此操作时,我收到一个错误,显示: couldn't open socket: connection refused while executing "socket $host $port" (procedure "Echo_Client" li

我是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

最后

谢谢,这会停止错误,但看起来它现在挂起了。这难道不应该返回对客户端请求的响应,即puts$s Hello吗?仅将vwait添加到服务器(它使用非阻塞IO)。您可能应该打印
gets$sock
的结果,但可以随心所欲。