在Emacs Lisp中编写简单的TCP客户端示例?

15
我想学习emacs elisp,尝试编写一个小程序来连接TCP/IP端口并处理返回的记录。在一个案例中,我将解析CSV数据,在另一个案例中,我将解析JSON(例如来自GPSD,幸运的是json.el附带了emacs)。我已经查看了echo-server示例,但我正在寻找一个客户机示例,该示例显示如何使用make-network-process连接和处理面向行的数据。这不是http,因此无法使用url-retrieve-synchronously。
我的elisp技能真的很弱,所以我正在寻找非常基本的示例。
谢谢!
3个回答

19

我一直在寻找更简单的方法。最终我从一个简化的TcpClient示例中编写了代码。如果将其保存为client.el,执行chmod +x client.el后,可以在命令行上运行./client.el。它将打印出服务器决定发送的任何内容,并在300秒后退出。但这段代码确实需要一些注释来解释正在发生的事情。

#!/usr/bin/emacs --script

(defvar listen-port 9999
    "port of the server")

(defvar listen-host "127.0.0.1"
    "host of the server")

(defun listen-start nil
    "starts an emacs tcp client listener"
    (interactive)
    (make-network-process :name "listen" :buffer "*listen*" :family 'ipv4 :host listen-host :service listen-port :sentinel 'listen-sentinel :filter 'listen-filter))

(defun listen-stop nil
  "stop an emacs tcp listener"
  (interactive)
  (delete-process "listen"))

(defun listen-filter (proc string)   
  (message string))

(defun listen-sentinel (proc msg)
  (when (string= msg "connection broken by remote peer\n")
    (message (format "client %s has quit" proc))))

(listen-start)
(sleep-for 300)
(listen-stop)

您,先生,是一位绅士和学者。如果我能给您一些我的声望点数,我会的。想知道有趣的事情吗?只需在“listen”缓冲区上调用comint-modeBAM即可获得即时交互式客户端。我非常喜欢Emacs。 - Lorem Ipsum

7

谢谢!我回头又读了一遍TcpClient的示例,然后将其简化为以下更简单的答案。 - Kurt Schwehr

5
如果你需要更加稳定的内容并且可能需要加密支持,你可以看一下 network-stream.elproto-stream.el

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接