Object Emacs Lisp网络连接-如何处理process对象?

Object Emacs Lisp网络连接-如何处理process对象?,object,emacs,process,network-programming,elisp,Object,Emacs,Process,Network Programming,Elisp,假设有一个TCP服务器在localhost:8080上运行,使用另一种理解列表的Lisp方言。现在,我在Elisp中打开一个网络连接 setq pserv (open-network-stream plisp "test1.l" "localhost" 8080) 并成功地将开放网络进程对象分配给变量pserv。但是接下来,我该如何使用这个进程对象向服务器发送请求呢?我想做的是将列表发送到另一台服务器(代码为数据),对其进行评估并返回结果 在上面的语句中,“test1.l”是与流程关联的Ema

假设有一个TCP服务器在localhost:8080上运行,使用另一种理解列表的Lisp方言。现在,我在Elisp中打开一个网络连接

setq pserv (open-network-stream plisp "test1.l" "localhost" 8080)
并成功地将开放网络进程对象分配给变量pserv。但是接下来,我该如何使用这个进程对象向服务器发送请求呢?我想做的是将列表发送到另一台服务器(代码为数据),对其进行评估并返回结果

在上面的语句中,“test1.l”是与流程关联的Emacs缓冲区,因此结果应该打印在该缓冲区中。如果我将nil放在那里,并且进程与任何缓冲区都没有关联,那么该如何从Elisp或进程对象访问服务器结果(可能也是列表形式)


Elisp手册似乎认为这些知识是理所当然的,但我在这里有点迷茫。如有任何提示,将不胜感激

在Emacs中,网络连接被视为异步子进程。因此,有关向子流程发送输入或从子流程读取输出的说明也适用于此处

要向服务器发送内容,请参阅;要读取结果,请参阅


信息以字符串形式通过网络传输,因此您可能希望在从服务器接收数据后使用
read
readfromstring
。请参阅。

客户端/服务器通信通过异步进程处理。这意味着不幸的是,您没有一个函数“send”,用于将要发送到服务器的数据传递给服务器,并返回服务器的回复。原因是网络通信可能很慢,这将阻止Emacs(单线程程序)中的所有其他操作

要将数据发送到服务器,请使用。第一个参数是您的网络连接,Emacs将其视为异步进程。由于该子流程对象已存储在变量
pserv
中,因此可以编写:

(process-send-string pserv "(my data (can be (in) (list) form))")
将字符串发送到服务器

要读取服务器的回复,可以使用,这是通过服务器发送给您的任何内容调用的回调。因此,首先必须定义这样一个回调函数,比如:

(defun handle-server-reply (process content)
   "Gets invoked whenever the server sends data to the client."
   ...)
此函数接受两个参数:网络进程和服务器发送的内容数据。不过,有一个棘手的问题:服务器回复可能被拆分为子内容。也就是说,当调用
handle server reply
时,
content
参数可能只包含服务器应答的一部分。稍后可能会再次调用它并提供更多内容。因此,请确保您正确地处理该问题

要将函数声明为回调函数,请使用:

(set-process-filter pserv 'handle-server-reply)
一如既往,字符编码可以是pita,因此请查看以下两个函数,并确定是否需要它们:

(set-process-filter-multibyte pserv t)
(set-process-coding-system pserv 'utf-8 'utf-8)
在分配流程过滤器功能之前,请确保设置这些参数

您可能还对调查网络连接的状态感兴趣,例如,处理连接意外关闭的情况。为此,您可以使用所谓的另一种回调类型,通过它您可以了解流程状态的更改:

(set-process-sentinel pserv 'sentinel-function)

(defun sentinel-function (process event)
  "Gets called when the status of the network connection changes."
   ...)
事件
参数包含有关连接状态更改方式的信息


我认为Emacs以前已经被指出过。这绝对值得一读。

谢谢托马斯,这是一个非常详细和有用的答案!这实际上是从手册中抄出来的。这本手册很好。你应该读一下。@nicferrier我同意,这就是为什么我的答案包含多个手册链接的原因。你的答案已经给出了关键信息:将网络连接视为异步子进程。所以我可以阅读Elisp手册了解更多信息。。。谢谢