Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何使用usocket创建连接?(公共lisp)_Sockets_Common Lisp_Usocket - Fatal编程技术网

Sockets 如何使用usocket创建连接?(公共lisp)

Sockets 如何使用usocket创建连接?(公共lisp),sockets,common-lisp,usocket,Sockets,Common Lisp,Usocket,我正在尝试使用lisp中的套接字创建连接。使用sbcl,我发现“usocket”可用。但是我无法在服务器和客户端之间发送字符串。代码如下: 服务器: (ql:quickload "usocket") (use-package 'usocket) (defun default-tcp-handler (stream) ; null (declare (type stream stream)) (terpri stream)) (defparameter *us* (socket-serve

我正在尝试使用lisp中的套接字创建连接。使用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流:

但它返回零

我怎样才能解决这个问题??
非常感谢。

我尝试了你的代码,没有出现错误,所以连接似乎一切正常。但是,如果只对流进行写入而不进行读取(更不用说刷新输出),则连接无法实现自身。以下是一个修改版本,其中服务器从套接字读取一行:

;;; 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
,因为除了
format nil
之外,它总是返回
nil
。服务器挂起,因为它开始侦听。如果您不想这样做,就必须使用多个线程。

请注意,在Common Lisp中,IO可以被缓冲。如果您希望看到它们实际被传输,请确保在相关输出操作之后始终使用
FINISH-OUTPUT
FORCE-OUTPUT
。这是合理的,但我想说的是,在运行客户端代码之后,服务器没有响应。所以我想知道上面的代码有什么问题吗?是不是有什么让我无法联系的地方?非常感谢,这很有效。我会改进它,使之成为一个发送-读取循环。但是为什么我不能使用
格式
,而必须使用
写行
?有什么不同?当然,您可以使用
格式
,它没有什么问题。这是一个通用工具,与写行不同。FWIW,(格式t(读行流))是个坏主意,从套接字读取时更糟。@Jeremiah:谢谢你发现了这一点,我添加了一个格式字符串。
;;; 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*)