如何使用usocket创建连接?(常见LISP) [英] How to use usocket to create a connection? (common lisp)

查看:39
本文介绍了如何使用usocket创建连接?(常见LISP)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用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流:

(format *st* "hello, server")

但它返回nil。

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

推荐答案

我尝试了您的代码,没有错误,因此连接似乎一切正常。但是,如果您只写入流而不读(更不用说刷新输出了),那么连接就没有办法表现出来。以下是修改后的版本,其中服务器从套接字读取一行:

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

这篇关于如何使用usocket创建连接?(常见LISP)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆