LispでSocket送受信
Javaで、Clientから受け取ったメッセージを出力するだけ、というServerSocketのアプリケーションを書いてみたので、Lispでそれと同等のServerアプリケーションとClientアプリケーションを書いてみる。こんな感じになった。
(defun open-echo-server (port) (let ((server (make-socket :type :stream :connect :passive :local-host "localhost" :local-port port))) (let ((client-socket (accept-connection server))) (format t "> Server received a message: ~%") (loop (let ((b (read-byte client-socket nil nil))) (unless b (return)) (format t "~a~%" b))) (close client-socket)) (close server)))
このサーバに接続してメッセージを送るクライアントは下記のような感じだ。
(defun send-message (destination-host destination-port message) (setf client (make-socket :address-family :internet :type :stream :connect :active :remote-host destination-host :remote-port destination-port)) (format client message) (format client "~%") (force-output client) (close client))
サーバ側の、(read-byte client-socket nil nil) が、JavaのinputStream.read()と同じような感じで、こうして読み込んだ文字は数字で出力される。read-byteでなく、read-charにすれば、数字でなく、文字列で、1文字ずつ出力される。行ごとに出力したい場合は、read-lineを使用すればよい。