You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.8 KiB

2 years ago
(in-package :pong.client)
(defparameter *client* nil)
(defclass client ()
((ip :initarg :ip :initform nil :reader client-ip)
(port :initarg :port :initform nil :reader client-port)
(running-p :initform nil :accessor client-running-p)
(socket :initform nil :accessor client-socket)))
(defmethod listen-to ((self client))
(with-slots (running-p socket) self
(when (and running-p (usocket:wait-for-input socket :timeout 5) running-p)
(let ((data (cpk:decode-stream (usocket:socket-stream socket))))
(format t "[CLIENT] Data received: ~a~%" data)))))
(defmethod start ((self client))
(with-slots (ip port running-p socket) self
(format t "uh?~%")
(unless running-p
(setf running-p t)
(setf socket (usocket:socket-connect ip port :element-type 'unsigned-byte)))))
(defmethod stop ((self client))
(with-slots (running-p socket) self
(setf running-p nil)
(when socket
(usocket:socket-close socket))
(setf socket nil)))
(defmethod write-to ((self client) data)
(let ((stream (usocket:socket-stream (client-socket self))))
(format t "[CLIENT] Data sent: ~a~%" data)
(cpk:encode data :stream stream)
(force-output stream)))
(defun handle-client ()
(loop while (and *client* (client-running-p *client*))
do (let ((data (listen-to *client*))))))
(defun start-client (ip port)
(unless *client*
(setf *client* (make-instance 'client :ip ip :port port))
(start *client*)
(bt:make-thread #'handle-client)))
(defun stop-client ()
(when *client*
(stop *client*))
(setf *client* nil))
(defun send-data-to-server (data)
(write-to *client* data))
(defun test-client ()
(start-client "127.0.0.1" 54321)
(write-to *client* "hello!")
(sleep 1.015)
(write-to *client* "bye!")
(stop-client))
;; (test-client)
;; (stop-client)