Pastey Socket object demo

Socket object demo

Example demonstrating how to send/receive Euphoria objects on-the-wire via TCP sockets.

sockobj.e

namespace sockobj 
 
include std/socket.e 
include std/serialize.e 
 
public function send_object( socket sock, object data, atom flags = 0 ) 
    return sockets:send( sock, serialize(data), flags ) 
end function 
 
public function receive_object( socket sock, atom flags = 0 ) 
     
    object data = sockets:receive( sock, flags ) 
     
    atom error = 0 
    object result = 0 
     
    if atom( data ) then 
        error = data 
    else 
        data = deserialize( data ) 
        result = data[1] 
    end if 
     
    return {error,result} 
end function 

server.ex

include std/socket.e 
include std/pretty.e 
include std/console.e 
include sockobj.e 
 
sequence pretty_options = PRETTY_DEFAULT 
pretty_options[ 1] = 2 -- display ASCII 
pretty_options[10] = 0 -- no line breaks 
 
procedure main() 
     
    socket server = sockets:create( AF_INET, SOCK_STREAM, 0 ) 
     
    sockets:bind( server, "0.0.0.0", 5000 ) 
    sockets:listen( server, 10 ) 
     
    while 1 do 
         
        object client = sockets:accept( server ) 
        sequence data = receive_object( client[1] ) 
         
        atom error = data[1] 
        object result = data[2] 
         
        if error = 0 then -- okay 
             
            printf( 1, "%d: ", client[1] ) 
            pretty_print( 1, result, pretty_options ) 
            puts( 1, "\n" ) 
             
            send_object( client[1], result ) 
             
        end if 
         
        sockets:shutdown( client[1] ) 
        sockets:close( client[1] ) 
         
    end while 
     
    sockets:shutdown( server ) 
    sockets:close( server ) 
     
end procedure 
 
main() 

client.ex

include std/socket.e 
include std/pretty.e 
include std/console.e 
include sockobj.e 
 
sequence pretty_options = PRETTY_DEFAULT 
pretty_options[ 1] = 2 -- display ASCII 
pretty_options[10] = 0 -- no line breaks 
 
procedure main() 
     
    socket s = sockets:create( AF_INET, SOCK_STREAM, 0 ) 
    sockets:connect( s, "127.0.0.1", 5000 ) 
     
    send_object( s, {"Hello", "world!", 12345, 0.9876} ) 
    sequence data = receive_object( s ) 
     
    atom error = data[1] 
    object result = data[2] 
     
    if error = 0 then -- okay 
         
        pretty_print( 1, result, pretty_options ) 
        puts( 1, "\n" ) 
         
    end if 
     
    sockets:shutdown( s ) 
    sockets:close( s ) 
     
    maybe_any_key() 
     
end procedure 
 
main()