package require itcl
package require json
package require ncgi
namespace import ::itcl::*
class StaffClientWithManhattan {
variable clientSocket
constructor {port} {
set host localhost
set clientSocket [socket $host $port]
fconfigure $clientSocket -buffering full -buffersize 4096
}
method send_message {message} {
set jsonMessage [json::dict2json $message]
set stringMessage [format "%s" $jsonMessage]
puts "request is: $stringMessage"
puts $clientSocket $stringMessage
flush $clientSocket
set replyFromServer [ncgi::decode [gets $clientSocket]]
puts " Response from server : $replyFromServer"
set resultInDict [json::json2dict $replyFromServer]
puts "from server in dict format: $resultInDict"
close $clientSocket
return $resultInDict
}
method create_component {varrequest_type varcommand varcomponent_type vardriver_path varrequest_timeout varhost varport} {
set message [dict create request_type $varrequest_type command $varcommand params [dict create component_type $varcomponent_type driver_path $vardriver_path request_timeout $varrequest_timeout host $varhost port $varport]]
puts "request in dictionary format: $message"
set response [send_message $message]
set component_id [dict get $response component_id]
return $component_id
}
method perform_action {varrequest_type varcommand varcomponent_id} {
set message [dict create request_type $varrequest_type command $varcommand params [dict create component_id $varcomponent_id]]
puts "Action message is: $message"
set response [send_message $message]
return $response
}
}
StaffClientWithManhattan scm 9999
set component_id "[scm create_component action create_component ManhattanClient C://NodeWebKit//chromedriver2_server.exe 5 localhost 9999]"
#StaffClientWithManhattan scm 9999
#scm perform_action action find_people 1
在这个程序中,我正在尝试连接到Python服务器,服务器正在接收请求并发送响应,但我的tcl客户端没有收到响应。请帮助我,我已经尝试了很多,但无法理解是什么问题。
答案 0 :(得分:0)
首先,真的挂在这条线上了吗?
set replyFromServer [ncgi::decode [gets $clientSocket]]
如果是这样,问题很可能是您的线路转换错误 - 使用套接字,Tcl默认使用CRLF,因为这对于网络协议来说通常是正确的 - 或者服务器不是& #39; t刷新其输出缓冲区。在客户端上使用strace
将允许您确定它是什么;客户端应该将数据接收到自身,如果没有,您就会知道真正的问题是服务器缓冲区没有被刷新。
如果它是一个行结束翻译问题,例如,因为另一端只是发送换行符,那么您必须修复您的客户端以期望它。 (混合的期望会带来麻烦,例如无休止地等待一个永远不会来的角色。)这可能就像更新fconfigure
以获得额外选项一样简单:
fconfigure $clientSocket -buffering full -buffersize 4096 -translation lf
如果不知道数据卡在哪里,很难说更多......