tcl客户端没有从python服务器接收响应

时间:2014-07-08 04:53:19

标签: tcl

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客户端没有收到响应。请帮助我,我已经尝试了很多,但无法理解是什么问题。

1 个答案:

答案 0 :(得分:0)

首先,真的挂在这条线上了吗?

set replyFromServer [ncgi::decode [gets $clientSocket]]

如果是这样,问题很可能是您的线路转换错误 - 使用套接字,Tcl默认使用CRLF,因为这对于网络协议来说通常是正确的 - 或者服务器不是& #39; t刷新其输出缓冲区。在客户端上使用strace将允许您确定它是什么;客户端应该将数据接收到自身,如果没有,您就会知道真正的问题是服务器缓冲区没有被刷新。

如果它是一个行结束翻译问题,例如,因为另一端只是发送换行符,那么您必须修复您的客户端以期望它。 (混合的期望会带来麻烦,例如无休止地等待一个永远不会来的角色。)这可能就像更新fconfigure以获得额外选项一样简单:

fconfigure $clientSocket -buffering full -buffersize 4096 -translation lf

如果不知道数据卡在哪里,很难说更多......