Shammer's Philosophy

My private adversaria

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を使用すればよい。