`(kakko ,man)

Find a guide into tomorrow by taking lessons from the past

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)

サーバ側を起動してから、クライアント側を実行したら・・・、あれっ?
f:id:tomekame0126:20161211135626p:plain

でも、サーバ側は落ちてるよね!
f:id:tomekame0126:20161211140315p:plain

ならば、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)

f:id:tomekame0126:20161211141633p:plain

ちゃんとサーバからお返事が返ってきました。

usocket での defpackage ダブル増しの小話でした。