Lisp Game Programming 再履修 <その6> usocket 小話
その筋では有名な usocket も使う機会がなかったため、どんなものか試したときのお話。
以下にある、cl-tcpip.lisp をサーバとクライアントに分け、チョットだけ手を入れて実行してみた。
https://gist.github.com/shortsightedsid/71cf34282dfae0dd2528
サーバ側 create-server.lisp ⇒
;;; Server Test ;;; Step1 <Define Packages> <Create Server> ;; ----------------------------------------------------------------------------------------------- ;; Step1 <Define Package> ;; ----------------------------------------------------------------------------------------------- (defpackage :server (:use :common-lisp :usocket) (:export #:create-server)) (in-package :server) ;; Step1 <Create Server> ;; ----------------------------------------------------------------------------------------------- (defun Create-server (&key (port 4000)) (let* ((socket (usocket:socket-listen "localhost" port)) (connection (usocket:socket-accept socket :element-type 'character))) (unwind-protect (progn (format (usocket:socket-stream connection) "I am tomekame0126~%") (force-output (usocket:socket-stream connection))) (progn (format t "Closing sockets~%") (usocket:socket-close connection) (usocket:socket-close socket))))) (Create-server)
クライアント側 create-client.lisp ⇒
;;; Client Test ;;; Step1 <Define Packages> <Create Client> ;; ----------------------------------------------------------------------------------------------- ;; Step1 <Define Package> ;; ----------------------------------------------------------------------------------------------- (defpackage :client (:use :common-lisp :usocket) (:export #:create-client)) (in-package :client) ;; Step1 <Create Client> ;; ----------------------------------------------------------------------------------------------- (defun Create-client (&key (port 4000)) (let ((socket (usocket:socket-connect "localhost" port :element-type 'character))) (unwind-protect (progn (usocket:wait-for-input socket) (format t "~A~%" (read-line (usocket:socket-stream socket)))) (usocket:socket-close socket)))) (Create-client)
サーバ側を起動してから、クライアント側を実行したら・・・、あれっ?
でも、サーバ側は落ちてるよね!
ならば、defpackage ダブル増しでどうよ。(ただの「増し」だよね?勢いで書きました!)
;;; Client Test ;;; Step1 <Define Packages> <Create Client> ;;; Step2 <Package Test> ;; ----------------------------------------------------------------------------------------------- ;; Step1 <Define Package> ;; ----------------------------------------------------------------------------------------------- (defpackage :client (:use :common-lisp :usocket) (:export #:create-client)) (in-package :client) ;; Step1 <Create Client> ;; ----------------------------------------------------------------------------------------------- (defun Create-client (&key (port 4000)) (let ((socket (usocket:socket-connect "localhost" port :element-type 'character))) (unwind-protect (progn (usocket:wait-for-input socket) (format t "~A~%" (read-line (usocket:socket-stream socket)))) (usocket:socket-close socket)))) ;; Step2 <Package Test> ;; ----------------------------------------------------------------------------------------------- (defpackage :start (:use :common-lisp :usocket :client)) (in-package :start) (Create-client)
ちゃんとサーバからお返事が返ってきました。
usocket での defpackage ダブル増しの小話でした。