Как использовать 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-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 ответ

Решение

Я попробовал твой код, но ошибок не было, поэтому с подключением все было в порядке. Однако, если вы пишете только в потоки без чтения (не говоря уже о сбросе вывода), соединение не может проявить себя. Вот модифицированная версия, где сервер читает одну строку из сокета:

;;; 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, Сервер зависает, потому что начинает слушать. Если вы этого не хотите, вам придется работать с несколькими потоками.

Другие вопросы по тегам