我正在尝试使用 lisp 中的套接字来创建连接。使用 sbcl,我发现“usocket”可用。但我无法在服务器和客户端之间发送字符串。这是代码:
Server:
(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*))
Client:
(ql:quickload "usocket")
(use-package 'usocket)
(defparameter *us* (socket-connect "127.0.0.1" 4547))
(defparameter *st* (usocket:socket-stream *us*))
我先运行服务器代码,它冻结了。然后我运行客户端代码。但服务器似乎没有任何反应。
我尝试将字符串格式化为st stream:
(format *st* "hello, server")
但它返回零。
我该如何解决这个问题?
多谢。
我尝试了你的代码,没有错误,所以连接似乎一切正常。但是,如果您只写入流而不读取(更不用说刷新输出),则连接无法自行显现。这是一个修改版本,其中服务器从套接字读取一行:
;;; 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
except format nil
。服务器挂起是因为它开始监听。如果您不希望这样,则必须使用多个线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)