Common Lisp socket編程最小實例——基於usocket

1. 服務端主要函數:socket-server

(require 'usocket)

(defpackage :myserver
  (:use :common-lisp :usocket)
  (:nicknames :mysrv)
  (:export "start-server"))

(in-package :mysrv)

(defun start-server (port)
  (socket-server "127.0.0.1" port #'(lambda (stream) (format stream "~a~%" "hello usocket"))))
該函數參考 https://common-lisp.net/project/usocket/api-docs.shtml

2. 客戶端主要函數:socket-connect

(require 'usocket)

(defpackage :myclient
  (:use :common-lisp :usocket)
  (:nicknames :mycli)
  (:export "start-client"))

(in-package :myclient)

(defun start-client (ip port)
  (let ((sock (usocket:socket-connect ip port)))
    (progn
      (force-output (usocket:socket-stream sock))
      (do ((line                                                  
         (read-line (usocket:socket-stream sock) nil)             
         (read-line (usocket:socket-stream sock) nil)))
       ((not line))                                               
      (format t "~A" line)))))
該函數參考 http://common-lisp.net/project/common-lisp-beginner/sockets_doc.html

3. 測試

測試環境爲emacs+slime,telnet,並假設你已經安裝好quicklisp。 html

服務端啓動後,使用telnet測試其是否能夠成功運行,圖示以下: web

客戶端鏈接服務端,圖示以下: api

可見,telnet和客戶端都正確返回"hello usocket"這一字符串。 websocket

4. 補充

客戶端發送函數: 併發

(require 'usocket)

(defvar sock '())

(defun myclient (host port)
  (setq sock (usocket:socket-connect host port)))

(defun my-send (buf)
  (if sock
      (progn
        (format (usocket:socket-stream sock) "~A" buf)
        (force-output (usocket:socket-stream sock))
        )
      nil))

本節參照: socket

http://stackoverflow.com/questions/25608424/websocket-client-in-common-lisp-with-usocket-library 函數

http://stackoverflow.com/questions/17257567/receiving-data-through-lisp-usocket 測試

http://www.lispworks.com/documentation/HyperSpec/Body/f_finish.htm#force-output ui

可正常連接服務端併發送數據,請自行測試。

enjoy youself ! spa

相關文章
相關標籤/搜索