One really neat feature is the ability to pass lisp expressions directly back and forth over a socket. This works very much like net-eval, but lets you control what the server does with the expression. This is extremely useful if you want to pass complex data back and forth or create your own multi-processing net-eval using the Cilk API - and, perhaps, my MP module :).
http://static.artfulcode.net/newlisp/sockets.lsp.html
Running a server
Code: Select all
(let ((server (SocketServer "/tmp/newlisp.sock")))
(:run-server server
(lambda (client server , request)
(if client
(begin
(setf request (:read-expr client))
(eval request) ; not safe unless you know your client
(:write-expr client '(println "Hello, client!"))
(:close client))
(println "client connection error: " (net-error))))
nil ; no operations between connections
(lambda (err server) (println "An error has occurred: " err))))
Code: Select all
; Connect to server process as a client
(let ((socket (Sockets:make-file-socket "/tmp/newlisp.sock")))
(:write-expr socket '(println "Hello, server!"))
(setf expr (:read-expr socket))
(:close socket))
(eval expr) ; not safe unless you know your server