我正在尝试通过USOCKET发送数据.当数据到达服务器时,服务器应该回复.但是,stream-read(如下定义)仅在数据与其发送的原始数据一起回显时返回数据.例如,如果我发送hello并且服务器回复相同的数据,hello则stream-read返回,但如果服务器回复hi,stream-read则在服务器发送它收到的确切缓冲区之前不会返回.
这是代码:(我在网上找到了大部分代码.)
;; Load USocket
(load #P"/usr/share/common-lisp/source/cl-asdf/asdf.lisp")
(asdf:operate 'asdf:load-op :usocket)
(defun stream-read (stream)
(socket-listen (usocket:socket-stream stream)))
(defun stream-print (string stream)
(write-line string (usocket:socket-stream stream))
(force-output (usocket:socket-stream stream)))
;; Define a stream
(defparameter my-stream
(usocket:socket-connect "127.0.0.1" 6003))
;; Use the stream
(stream-print "random" my-stream)
(print (stream-read my-stream))
Run Code Online (Sandbox Code Playgroud)
至于服务器,我使用了一个略微修改版本的boost阻塞服务器示例.(c ++)完整的代码可以在这里找到:http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/echo/blocking_tcp_echo_server.cpp
...
void session(socket_ptr sock)
{
try
{
for (;;)
{
char data[max_length];
boost::system::error_code error;
size_t …Run Code Online (Sandbox Code Playgroud) 我正在尝试升级协议,从HTTP 1.1切换到WebSockets.我试过用usocket.到目前为止我的代码如下(并作为GitHub要点提供).握手读取后,函数返回NIL或unexpected EOF错误.
;; Define parameter sock for usocket stream
;; echo.websocket.org is a site for testing websockets
(defparameter sock (usocket:socket-connect "echo.websocket.org" 80))
;; Output confirms WebSocket protocol handshake as this implemented in browsers
(format (usocket:socket-stream sock) "~A~%~A~%~A~%~A~%~A~A~%~A~%~A~%~%"
"GET /?encoding=text HTTP/1.1"
"Connection: Upgrade"
"Host: echo.websocket.org"
"Origin: http://www.websocket.org"
"Sec-WebSocket-Key: " (generate-websocket-key)
"Sec-WebSocket-Version: 13"
"Upgrade: websocket")
;; Write output to stream
(force-output (usocket:socket-stream sock))
;; Returns NIL
(do ((line
(read-line (usocket:socket-stream sock) nil)
(read-line …Run Code Online (Sandbox Code Playgroud) 我从 Common Lisp Cookbook 中找到了这个例子,它展示了如何使用 usocket 启动 TCP 服务器。
该示例创建一个套接字对象并建立连接,然后写入套接字。万一出现错误,套接字写入被包裹在一个 unwind-protect 中,它将关闭套接字以便它可以被重用。我已经重写了导致错误的示例,但是当我多次运行它时,我得到一个USOCKET:ADDRESS-IN-USE-ERROR. 如果我删除socket-close函数调用,行为是相同的。
(load "~/quicklisp/setup.lisp")
(ql:quickload "usocket")
(let* ((socket (usocket:socket-listen "localhost" 8080))
(connection (usocket:socket-accept socket)))
(unwind-protect
(progn
(error "error 1"))
(progn
(usocket:socket-close connection)
(usocket:socket-close socket)
(print "Error clean up"))))
Run Code Online (Sandbox Code Playgroud)
Unhandled USOCKET:ADDRESS-IN-USE-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
{10005E85B3}>:
Condition USOCKET:ADDRESS-IN-USE-ERROR was signalled.
Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {10005E85B3}>
0: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<USOCKET:ADDRESS-IN-USE-ERROR {1003FDC063}> #<unused argument> :QUIT T)
1: (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<USOCKET:ADDRESS-IN-USE-ERROR {1003FDC063}>)
2: (INVOKE-DEBUGGER …Run Code Online (Sandbox Code Playgroud)