Tcl-在套接字缓冲区中获取消息



我创建了一个套接字客户端来连接到python服务器。

我查看了tcl手动脚本,它说"得到">-将行设置为EOL字符。

手动:https://www.tcl.tk/man/tcl8.4/TclCmd/gets.htm

但是,从python服务器发送的消息没有EOL。

是否可以直接从缓冲区获取?

网络连接线路末端的标准是CRLF,默认情况下Tcl会在其中打开套接字,但服务器可能不遵守。

尝试fconfigure $mysocket -translation auto同时接受CR、LF和CRLF。

使用二进制数据(即不基于行(时,read命令通常比gets更合适。

read命令的手册页面可在此处找到:http://www.tcl.tk/man/tcl/TclCmd/read.htm

我还鼓励你使用一个比8.4更新的Tcl版本,它已经有十多年的历史了。当前版本为Tcl 8.6。


在评论中提供更多详细信息后更新:

如果服务器没有指示它发送的数据的长度,没有在末尾发送换行符,也没有关闭套接字,这对客户端来说就很困难了。

在Tcl中,通常的处理方法是将通道设置为非阻塞并侦听可读事件:

set fd [socket $server $port]
fconfigure $fd -blocking 0 -buffering line
fileevent $fd readable [list receive $fd]
# Send an initial string to the server
puts $fd Hello!
proc receive {fd} {
if {[eof $fd]} {
puts "The server closed the connection"
close $fd
exit
} else {
set data [read $fd]
if {$data ne ""} {
puts "Received: $data"
# Send a response back to the server
if {$data eq "Hey guys"} {
puts $fd "Hey you"
} else {
puts $fd "I don't understand $data"
}
}
}
}
# Run the event loop (not necessary when using Tk)
vwait forever

通过使信道不阻塞,read命令将返回该时间点的所有可用数据。可读事件在有任何可用数据时触发。简单地在连接后立即调用read可能根本不会产生任何数据。所以这是行不通的。另一种选择是每x毫秒轮询一次,但效率相当低。

注意:有些人可能会指出上面的接收过程是不正确的,因为"对eof的检查必须在读取"之后进行;。但这些人并没有完全掌握基于事件的文件处理。如果read命令遇到文件或流的末尾,则可读事件将立即再次激发。receive进程将被再次调用,然后它将处理文件结束条件。

最新更新