首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用usocket创建连接?(普通lisp)

如何使用usocket创建连接?(普通lisp)
EN

Stack Overflow用户
提问于 2015-09-26 11:52:15
回答 1查看 1.4K关注 0票数 3

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

服务器:

代码语言:javascript
复制
(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*))

客户端:

代码语言:javascript
复制
(ql:quickload "usocket")
(use-package 'usocket)
(defparameter *us* (socket-connect "127.0.0.1" 4547))
(defparameter *st* (usocket:socket-stream *us*))

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

代码语言:javascript
复制
(format *st* "hello, server")

但结果是零。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-27 12:29:02

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

代码语言:javascript
复制
;;; 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。服务器挂起是因为它开始监听。如果您不想这样做,您将不得不使用多个线程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32796877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档