- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试通过 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))
至于服务器,我使用的是 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 length = sock->read_some(boost::asio::buffer(data), error);
if (error == boost::asio::error::eof)
break; // Connection closed cleanly by peer.
else if (error)
throw boost::system::system_error(error); // Some other error.
std::vector<char> v(data,data+length);
std::string theStr;
for(unsigned int i=0;i<v.size();i++)
{
if(v[i]<32 || v[i]>=0x7f);//Remove non-ascii char
else theStr.insert(theStr.end(),v[i]);
}
std::cout<<"|"<<theStr<<"|"<<std::endl;
boost::asio::write(*sock, boost::asio::buffer(data, length)); //works
boost::asio::write(*sock, boost::asio::buffer("some", 4)); //doesn't work
}
}
catch (std::exception& e)
{
std::cerr << "Exception in thread: " << e.what() << "\n";
}
}
...
最佳答案
如果没有看到您服务器的代码,就很难不加猜测地回答。但是:
从客户端到服务器的每次调用都使用相同的套接字。如果服务器没有预料到这一点,它的行为将不会如您所愿。
您定义的 stream-read
调用 socket-listen
。您是说 usocket:socket-listen
吗?这是一个服务器端函数(并采用不同的参数)。我可能没有查看您正在运行的确切代码。
忠告: (a) my-stream
实际上是套接字,不是流; (b) 我鼓励您使用 Quicklisp 管理外部库.
这是一个完整的工作示例。这是在 LispWorks 上;我为服务器使用了 LW 内部结构,以完全清楚哪个是服务器,哪个是客户端。
CL-USER 1 > (ql:quickload :usocket)
To load "usocket":
Load 1 ASDF system:
usocket
; Loading "usocket"
(:USOCKET)
CL-USER 2 > (comm:start-up-server
:service 6003
:function (lambda (handle)
(let* ((stream (make-instance 'comm:socket-stream
:socket handle
:direction :io
:element-type 'base-char))
(line (read-line stream)))
(format stream "Hello: ~a~%" line)
(force-output stream))))
#<MP:PROCESS Name "6003 server" Priority 85000000 State "Running">
CL-USER 3 > (defun socket-read (socket)
(read-line (usocket:socket-stream socket)))
SOCKET-READ
CL-USER 4 > (defun socket-print (string socket)
(write-line string (usocket:socket-stream socket))
(force-output (usocket:socket-stream socket)))
SOCKET-PRINT
CL-USER 5 > (defun test (thing)
(let ((socket (usocket:socket-connect "127.0.0.1" 6003)))
(socket-print thing socket)
(socket-read socket)))
TEST
CL-USER 6 > (test "Buttered toast")
"Hello: Buttered toast"
NIL
CL-USER 7 > (test "A nice cup of tea")
"Hello: A nice cup of tea"
NIL
如果您仍然遇到困难,请再次发布您服务器的源代码和您实际的stream-read
。
关于sockets - 通过 LISP USOCKET 接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17257567/
我正在学习 common-lisp,我正在尝试使用 usocket library 使用客户端和服务器 tcp 套接字连接编写一个愚蠢的聊天程序.下面是我的函数。 (defun receive-thr
我有一个使用 quicklisp 加载 zs3 以访问 Amazon 的 S3 的脚本。 当我使用 clisp 运行脚本时,当 (zs3:bucket-exists-p "Test") 运行时,USO
据我了解,IOLib和 usocket具有几乎相同的抽象级别。 IOLib 使用操作系统后端套接字,另一方面 usocket 使用 Lisp 运行时后端套接字。 我只是想知道对于特定用例哪个是更好的选
我正在尝试使用 lisp 中的套接字来创建连接。使用 sbcl,我发现“usocket”可用。但是我未能在服务器和客户端之间发送字符串。这是代码: 服务器: (ql:quickload "usocke
我正在尝试通过 USOCKET 发送数据.当数据到达服务器时,服务器应该回复。但是,stream-read(定义如下)仅在数据与它发送的原始数据回显时才返回数据。例如,如果我发送 hello 并且服务
我正在尝试连接到泥客户端,所以我使用 usockets 通过 tcp 进行连接。但是在我写完之后,我得到了一个解码错误读数。我有理由相信编码应该是 ascii,或者至少使用 :clrf 作为行尾指示符
我是 Common Lisp 的新手,我正在尝试学习如何使用网络套接字进行编程。在普通的 lisp 中 usocket api它指定函数 socket-send 和 socket-receive 采用
我正在尝试升级协议(protocol),从 HTTP 1.1 切换到 WebSockets。我试过使用 usocket .到目前为止我的代码如下(并且可以作为 GitHub gist 获得)。握手读取
目前我有一个无法解释的行为,感谢任何线索。 背景 我有一个通过 PHP 内置开发网络服务器本地运行的 WordPress 实例 php -S localhost:8000 -t/doc/root/wo
我正在使用以下代码获取 url http://brandonhsiao.com/essays.html: (defparameter *new-line* '(#\Return #\Newline))
我是一名优秀的程序员,十分优秀!