その筋では有名な usocket も使う機会がなかったため、どんなものか試したときのお話。

以下にある、cl-tcpip.lisp をサーバとクライアントに分け、チョットだけ手を入れて実行してみた。

https://gist.github.com/shortsightedsid/71cf34282dfae0dd2528

サーバ側 create-server.lisp ⇒

( defpackage :server ( :use :common-lisp :usocket ) ( :export #:create-server )) ( in-package :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 ⇒

( defpackage :client ( :use :common-lisp :usocket ) ( :export #:create-client )) ( in-package :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 ダブル増しでどうよ。（ただの「増し」だよね？勢いで書きました！）

( defpackage :client ( :use :common-lisp :usocket ) ( :export #:create-client )) ( in-package :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 )))) ( defpackage :start ( :use :common-lisp :usocket :client )) ( in-package :start ) ( Create-client )

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

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