[Xotcl] object method as (fileevent) callback

Vladimir vladimir.novikov.k at yandex.ru
Wed Feb 1 19:44:44 CET 2023


Hello, I have a question.

It is a simple Server example TclOO implementaiton below. I mark with yellow two lines, where I can use mymethod command to set private methods of class as callbacks. Both of this callbacks execute in class instance context.
Is it possible do same thing with nx? I want incapsulate server logic inside nx::Class and set private method as callback to accept connection and reading data.

#!/usr/bin/env tclsh

package require oo::util ;# for 'mymethod' command
package require logger

logger::initNamespace proj::Server debug

oo::class create proj::mock::Server {

    constructor { port } {
        my variable projVersion_
        my variable port_
        my variable socket_

        set projVersion_ "0.1"
        set port_ $port

        ::logger::tree::proj::Server::debug "Init mock Server $projVersion_"

        # it works!
        set socket_ [socket -server [mymethod Accept_clb] $port]
    } ;# constructor

    method Accept_clb { sock addr port } {
        my variable clients_

        ::logger::tree::proj::Server::debug "Accepting connection with $addr $port"
        set clients_(addr,$sock) [list $addr $port]

        fconfigure $sock -translation binary -buffering none
        fileevent $sock readable [mymethod Echo_clb $sock] ;# it works too!
        ::logger::tree::proj::Server::debug "Setting callback private method"
    } ;# Accept_clb

    method Echo_clb { sock } {
        my variable clients_

        ::logger::tree::proj::Server::debug "Readable callback call"

        if { [eof $sock] } {
            ::logger::tree::proj::Server::debug "No more data in socket"

            close $sock
            unset clients_(addr,$sock)
        } else {
            set binary_msg [read $sock 2]
            binary scan $binary_msg "H*" string_msg

            ::logger::tree::proj::Server::debug "Readed 2 bytes"

            if [string length $string_msg] {
                ::logger::tree::proj::Server::debug "Sending 2 bytes left"

                puts -nonewline $sock $binary_msg
            }
        }
    } ;# Echo_clb

    destructor {
        my variable socket_
        close $socket_

        ::logger::tree::proj::Server::debug "Destroing Server"
    } ;# destructor

} ;# dms::mock::server

set s [proj::mock::Server new 1950]

vwait forever





More information about the Xotcl mailing list