|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
;; This file:
;; http://angg.twu.net/elisp/echo-server.el.html
;; http://angg.twu.net/elisp/echo-server.el
;; (find-angg "elisp/echo-server.el")
;; Author: Eduardo Ochs <eduardoochs@gmail.com>
;;
;; (defun e () (interactive) (find-angg "elisp/echo-server.el"))
;; https://www.emacswiki.org/emacs/EmacsEchoServer
(defvar echo-server-port 10000
"port of the echo server")
(defvar echo-server-clients '()
"alist where KEY is a client process and VALUE is the string")
;; (find-elnode "Process Information")
;; (find-efunction 'list-processes)
;; (find-efunction 'list-processes--refresh)
(list-processes)
(process-list)
(process-contact (car (process-list)))
(find-eppp
(cl-loop
for p in (process-list)
collect
(list p
:id (process-id p)
:name (process-name p)
:type (process-type p)
:status (process-status p)
:sentinel (process-sentinel p)
:filter (process-filter p)
:buffer (process-buffer p)
)))
(defun echo-server-start nil
"starts an emacs echo server"
(interactive)
(unless (process-status "echo-server")
(make-network-process
:name "echo-server"
:buffer "*echo-server*"
:family 'ipv4
:service echo-server-port
:sentinel 'echo-server-sentinel
:filter 'echo-server-filter
:server 't)
(setq echo-server-clients '())))
(defun echo-server-stop nil
"stop an emacs echo server"
(interactive)
(while echo-server-clients
(delete-process (car (car echo-server-clients)))
(setq echo-server-clients (cdr echo-server-clients)))
(delete-process "echo-server"))
(defun echo-server-filter (proc string)
(let ((pending (assoc proc echo-server-clients))
message
index)
;;create entry if required
(unless pending
(setq echo-server-clients (cons (cons proc "") echo-server-clients))
(setq pending (assoc proc echo-server-clients)))
(setq message (concat (cdr pending) string))
(while (setq index (string-match "\n" message))
(setq index (1+ index))
(process-send-string proc (substring message 0 index))
(echo-server-log (substring message 0 index) proc)
(setq message (substring message index)))
(setcdr pending message)))
(defun echo-server-sentinel (proc msg)
(when (string= msg "connection broken by remote peer\n")
(setq echo-server-clients (assq-delete-all proc echo-server-clients))
(echo-server-log (format "client %s has quit" proc))))
;;from server.el
(defun echo-server-log (string &optional client)
"If a *echo-server* buffer exists, write STRING to it for logging purposes."
(if (get-buffer "*echo-server*")
(with-current-buffer "*echo-server*"
(goto-char (point-max))
(insert (current-time-string)
(if client (format " %s:" client) " ")
string)
(or (bolp) (newline)))))
;; Local Variables:
;; coding: utf-8-unix
;; End: