Lisp/TCP e Lisp

Indice del libro

Lo sviluppo di internet e dei sistemi di comunicazione coinvolge anche linguaggi come il Lisp che in potenti macro consente di conversare in client/server tra sistemi in rete.

In questo esempio mettiamo in campo un codice server che mette a disposizione di alcuni client nella rete delle letture rilevate da una seriale che prende il flusso dati da una testa GPS in codice NMEA leggibile in ASCII.

Un ottimo test per vedere la semplicità della chiamate al Layer TCP/IP e per provare la stabilità di questo codice che trasmette indisturbato all'infinito tra un client e un server.

Codice lato client

 (defun open-socket (host port)
  (socket-connect port host))
 (defun client (server port a-string)
  ;; Open connection
  (let ((socket (open-socket server port)))
    (unwind-protect
     (progn
       (format socket "~A~%" a-string)
       (force-output socket)
       (let ((response (read-line socket)))
       (format t "Response from server: ~A~%" response))))
    ;; Close socket before exiting.
    (close socket)))
 (defun test ()
  (client "clavius.ess.prv" 25 "helo"))

Codice lato server

 (defun server()
  (let ((a-server-socket (socket-server 8000)))
    (dotimes (i 2) 
      (let ((connection (socket-accept a-server-socket)))
        (let ((line (read-line connection)))
          (format t "Line from client: ~A~%" line )
          ;;; 
          ;;; send 
          (format connection "response from serveri~%"))
          (close connection )))
    (socket-server-close a-server-socket)))