Network programming in elisp


  Network API in elisp

1 Introduction

Emacs is not just an editor, Yes, that's true. Emacs lisp can do network connection programming by its network API. But there is something difference with other kinds of programming language.

First, elisp do not support multi-thread, pretty cool, huh!! Yeh, Multi-threads programming is a horrible venture for you, right!

Second, There is no socket similarly conception in elisp, and elisp provide network programming ability as processes.

Elisp can open a network connection by function – open-network-stream.
 It can make network connection server listen a special port by function - make-network-process. Both of those function return a process object. Then you can communicate with the process by process's API.

2 A example

I write a snippet code to figure out How to use it.

(require 'cl)

(defvar my-network-client-buffer "*-client-buffer*")
(defvar my-network-client-name "my-network-client")

(defvar my-network-host "localhost")
(defvar my-network-port 9734)

(defvar my-net-process nil)

(defvar my-network-server-buffer "*-server-buffer*")
(defvar my-network-server-name "my-network-server")
(defvar my-net-server nil)

(defun my-test-network-client-conn ()
  "Test network process"
  (let* ((name (or my-network-client-name "localhost"))
        (buffer (get-buffer-create (or my-network-client-buffer "*-my-net-client-buffer*")))
        (host (or my-network-host "localhost"))
        (service (or my-network-port 8080))
        (net-process (open-network-stream name buffer host service)))
    (setq my-net-process net-process)
    ))

(defun my-test-net-client-send (str)
  "Send string to server"
  (interactive "sEnter string to send: ")
  (if (not (stringp str))
      (error "invalid parameter"))
  (if (null my-net-process)
      (my-test-network-client-conn))
  (process-send-string my-net-process str)
  )

(defun my-test-net-client-close ()
  (interactive)
  (unless (null my-net-process) (kill-process my-net-process))
  (setq my-net-process nil))

;;  :buffer (or my-network-server-buffer "*my-server-buffer")
;; :host (or my-network-host "localhost")
(defun my-test-net-server-start ()
  (interactive)
  (if (null my-net-server)
      (setq my-net-server 
            (make-network-process :name (or my-network-server-name "*my-server-name")
                                  :server t
                                  :service (or my-network-port 8810)
                                  :family 'ipv4
                                  :filter 'my-listen-filter))))

(defun my-listen-filter (proc string)
  (message "%s" string)
  (process-send-string proc string)
  )

(defun my-test-net-server-stop () 
  (interactive)
  (kill-process my-net-server)
  (setq my-net-server nil))

(provide 'my-test-network)

3 Http server implemented by elisp

With network process API, elisp can do network programming, three are several projects that implemented HTTP web server by elisp.

 elnode : A Evented io webserver right inside emacs. It also provides a wiki engine inside.

 simple-HTTP-server: A much simpler example.

Comments

Popular posts from this blog

Bluedroid stack in android

How to setup a NAT server?