使用套接字学习TCL在本地机器上设置echo服务器
我是TCL的新手,在《实用编程》一书中尝试了一个例子 我正在尝试使用同一文件中的客户端连接到echo服务器。因此,我创建了一个名为EchoServer.tclsh的文件。然后,我在其中编写了echo服务器代码和echoclient代码。运行此操作时,我收到一个错误,显示:使用套接字学习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
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
的结果,但可以随心所欲。