newLISP 简介 / 互联网
外观
大多数网络任务都可以使用 newLISP 的网络功能完成
- base64-dec 将字符串从 BASE64 格式解码
- base64-enc 将字符串编码为 BASE64 格式
- delete-url 删除 URL
- get-url 从网络读取文件或页面
- net-accept 接受新的传入连接
- net-close 关闭套接字连接
- net-connect 连接到远程主机
- net-error 返回最后一次错误
- net-eval 在多个远程 newLISP 服务器上评估表达式
- net-interface 定义默认网络接口
- net-listen 监听对本地套接字的连接
- net-local 连接的本地 IP 和端口号
- net-lookup IP 编号的名称
- net-peek 准备好读取的字符数
- net-peer net-connect 的远程 IP 和端口
- net-ping 向一个或多个地址发送 ping 包(ICMP 回声请求)
- net-receive 在套接字连接上读取数据
- net-receive-from 在打开的连接上读取 UDP 数据报
- net-receive-udp 在打开的连接上读取 UDP 数据报并关闭连接
- net-select 检查套接字或套接字列表的状态
- net-send 在套接字连接上发送数据
- net-send-to 在打开的连接上发送 UDP 数据报
- net-send-udp 发送 UDP 数据报并关闭连接
- net-service 将服务名称转换为端口号
- net-sessions 返回当前打开的连接列表
- post-url 将信息发布到 URL 地址
- put-url 将页面上传到 URL 地址。
- xml-error 返回最后一次 XML 解析错误
- xml-parse 解析 XML 文档
- xml-type-tags 显示或修改 XML 类型标签
使用这些网络功能,您可以构建各种网络应用程序。使用诸如 net-eval 之类的功能,您可以将 newLISP 作为守护进程启动在远程计算机上,然后在本地计算机上使用它将 newLISP 代码发送到网络进行评估。
这是一个使用 get-url 的非常简单的示例。给定网页的 URL,获取源代码,然后使用 replace 及其列表构建功能来生成该页面上所有 JPEG 图像的列表
(set 'the-source (get-url "http://www.apple.com"))
(replace {src="(http\S*?jpg)"} the-source (push $1 images-list -1) 0)
(println images-list)
("http://images.apple.com/home/2006/images/ipodhifititle20060228.jpg" "http://images.apple.com/home/2006/images/ipodhifitag20060228.jpg" "http://images.apple.com/home/2006/images/macminiwings20060228.jpg" "http://images.apple.com/home/2006/images/macminicallouts20060228.jpg" "http://images.apple.com/home/2006/images/ipodhifititle20060228.jpg" "http://images.apple.com/home/2006/images/ipodhifitag20060228.jpg")
最简单的搜索表单可能类似于以下内容。
(load "cgi.lsp")
(println (string "Content-type: text/html\r\n\r\n"
[text]<!doctype html>
<html>
<head>
<title>Title</title>
</head>
<body>
[/text]))
(set 'search-string (CGI:get "userinput"))
(println (format [text]
<form name="form" class="dialog" method="GET">
<fieldset>
<input type="text" value="search" name="userinput" >
<input type="submit" style="display:none"/>
</fieldset>
</form>[/text]))
(unless (nil? search-string)
(println " I couldn't be bothered to search for \"" search-string "\""))
(println [text]
</body>
</html>
[/text])
以下代码实现了一个简单的 IRC(Internet Relay Chat)客户端,它展示了如何使用基本网络功能。脚本使用给定的用户名登录到服务器,并加入 #newlisp 频道。然后,脚本分为两个线程:第一个线程在连续循环中显示任何频道活动,而第二个线程在控制台中等待输入。两个线程之间唯一的通信是通过共享的 connected 标志进行的。
(set 'server (net-connect "irc.freenode.net" 6667))
(net-send server "USER newlispnewb 0 * :XXXXXXX\r\n")
(net-send server "NICK newlispnewb \r\n")
(net-send server "JOIN #newlisp\r\n")
(until (find "366" buffer)
(net-receive server buffer 8192 "\n")
(print buffer))
(set 'connected (share))
(share connected true)
(fork
(while (share connected)
(cond
((net-select server "read" 1000) ; read the latest
(net-receive server buffer 8192 "\n")
; ANSI colouring: output in yellow then switch back
(print "\n\027[0;33m" buffer "\027[0;0m"))
((regex {^PING :(.*)\r\n} buffer) ; play ping-pong
(net-send server (append "PONG :" (string $1 ) "\r\n"))
(sleep 5000))
((net-error) ; error
(println "\n\027[0;34m" "UH-OH: " (net-error) "\027[0;0m")
(share connected nil)))
(sleep 1000)))
(while (share connected)
(sleep 1000)
(set 'message (read-line))
(cond
((starts-with message "/") ; a command?
(net-send server (append (rest message) "\r\n"))
(if
(net-select server "read" 1000)
(begin
(net-receive server buffer 8192 "\n")
(print "\n\027[0;35m" buffer "\027[0;0m"))))
((starts-with message "quit") ; quit
(share connected nil))
(true ; send input as message
(net-send server (append "PRIVMSG #newlisp :" message "\r\n")))))
(println "finished; closing server")
(close server)
(exit)