如何使用usocket创建连接? (常见的lisp)

时间:2015-09-26 11:52:15

标签: sockets common-lisp usocket

我试图在lisp中使用socket来创建连接。使用sbcl,我发现" usocket"可用。但我没能在服务器和客户端之间发送字符串。这是代码:

服务器:

(ql:quickload "usocket")
(use-package 'usocket)
(defun default-tcp-handler (stream) ; null
  (declare (type stream stream))
  (terpri stream))
(defparameter *us* (socket-server "127.0.0.1" 4547 #'default-tcp-handler))
(defparameter *s* (socket-accept *us*))
(defparameter *ss* (usocket:socket-stream *s*))

客户端:

(ql:quickload "usocket")
(use-package 'usocket)
(defparameter *us* (socket-connect "127.0.0.1" 4547))
(defparameter *st* (usocket:socket-stream *us*))

我先运行服务器代码,它冻结了。然后我运行了客户端代码。但服务器似乎没有回应。 我尝试将字符串格式化为 st 流:

(format *st* "hello, server")

但它返回零。

我该如何解决问题? 非常感谢。

1 个答案:

答案 0 :(得分:2)

我尝试了你的代码而且没有错误,所以连接似乎都没问题。但是,如果您只是在没有读取的情况下写入流(更不用说刷新输出),则连接无法显示自身。这是一个修改版本,服务器从套接字中读取一行:

;;; server
(ql:quickload "usocket")
(use-package :usocket)
(defun default-tcp-handler (stream)
  (declare (type stream stream))
  (format t "~A~%" (read-line stream))
  (finish-output))
(defparameter *us* (socket-server "127.0.0.1" 4547 #'default-tcp-handler))

;;; client
(ql:quickload "usocket")
(use-package :usocket)
(defparameter *us* (socket-connect "127.0.0.1" 4547))
(defparameter *st* (socket-stream *us*))
(write-line "hello server" *st*)
(finish-output *st*)

在您的情况下,format返回nil,因为除nil外,它始终返回format nil。服务器挂起,因为它开始监听。如果您不想要,那么您必须使用多个线程。