23
23
" Erase the last line by using ANSI Escape codes"
24
24
(format t " ~C [1A~C [2K" #\Esc #\Esc ))
25
25
26
+ (defun exit (&optional (code 0 ))
27
+ #- swank
28
+ (uiop :quit code))
26
29
27
30
(defun get-user-input (username)
28
31
" Get the user input by using readline"
32
+ (declare (ignore username))
33
+ #+ swank (read-line )
34
+ #- swank
29
35
(prog1 (cl-readline :readline :prompt (format nil " [~A ]: " username)
30
36
:erase-empty-line t
31
37
:add-history t )
46
52
; ; before printing messages from server, so I'm cleaning all the stuff
47
53
; ; before print a new message, and restore again. Maybe there is a
48
54
; ; better way for doing that.
55
+ #- swank
49
56
(defun receive-message (message)
50
57
" Receive a message and print in the terminal carefully with IO race conditions"
51
58
(with-lock-held (*io-lock* )
64
71
(cl-readline :set-prompt prompt)
65
72
(cl-readline :redisplay)))))
66
73
74
+ #+ swank
75
+ (defun receive-message (message)
76
+ " Receive a message and print in the terminal carefully with IO race conditions"
77
+ (unless (system-pongp message)
78
+ (format t " ~a~% " message)))
79
+
80
+
67
81
(defun client-sender (socket username)
68
82
" Routine to check new messages being typed by the user"
69
83
(loop for message = (get-user-input username)
70
84
when (or (equal message " /quit" )
71
85
(equal message nil ))
72
86
return nil
73
87
do (send-message message socket))
74
- (uiop :quit ))
88
+ (exit ))
75
89
76
90
77
91
(defun server-listener (socket)
85
99
(handler-case (server-listener socket)
86
100
(end-of-file (e)
87
101
(format t " ~% End of connection: ~a~% " e)
88
- (uiop :quit 1 ))
102
+ (exit 1 ))
89
103
(simple-error ()
90
104
(server-broadcast socket))))
91
105
@@ -112,15 +126,14 @@ The systematic pong is consumed and the @server response is not shown in the ter
112
126
(let* ((socket (socket-connect host port))
113
127
(username (login socket)))
114
128
(format t " Connected as ~a \@ ~a \: ~a ~% " username *host* *port* )
115
- (let ((sender (make-thread (lambda () (client-sender socket username))
116
- :name " client sender" ))
117
- (broadcast (make-thread (lambda () (server-broadcast socket))
129
+ (let ((broadcast (make-thread (lambda () (server-broadcast socket))
118
130
:name " server broadcast" ))
119
131
(background-ping (make-thread (lambda () (client-background-ping socket))
120
132
:name " background ping" )))
121
- (join-thread background-ping)
122
- (join-thread sender)
123
- (join-thread broadcast))))
133
+ (client-sender socket username)
134
+ (destroy-thread background-ping)
135
+ (destroy-thread broadcast)
136
+ (socket-close socket))))
124
137
125
138
(defun main (&key (host *host* ) (port *port* ))
126
139
" Main function of client"
@@ -130,7 +143,7 @@ The systematic pong is consumed and the @server response is not shown in the ter
130
143
#+ clisp system ::simple-interrupt-condition
131
144
#+ ecl ext :interactive-interrupt
132
145
#+ allegro excl :interrupt-signal ()
133
- (uiop :quit 0 ))
146
+ (exit 0 ))
134
147
(usocket :connection-refused-error ()
135
148
(progn (write-line " Server seems offline. Run first the server.lisp." )
136
- (uiop :quit 1 )))))
149
+ (exit 1 )))))
0 commit comments