我试图在Racket中创建一个简单的echo服务器和客户端。
这是服务器:
(define (hello_listen port)
(define listener (tcp-listen port))
(define (loop)
(define-values (in out) (tcp-accept listener))
(thread (lambda ()
(copy-port in out)
(close-output-port out)))
(loop))
(loop))
这是客户:
(define (hello_socket port)
(define-values (in out) (tcp-connect "localhost" port))
(write "hello socket world\n" out)
(display (read in)))
客户端没有收到任何文本,只是挂起读取。
当我用Python编写一个简单的客户端时,行为很好:
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect(('localhost', 9999))
>>> s.send("hi")
2
>>> s.recv(500)
'hi'
我在Racket客户端代码中缺少什么?
答案 0 :(得分:2)
这里有两个问题:
Racket缓冲区中的TCP端口。所以在您的球拍脚本中,您实际上并没有发送数据。解决此问题的最简单方法是使用flush-output
,但这会导致您的第二个问题。
您的服务器使用copy-port
,根据文档,在端口关闭之前不会完成。因此,您可以自行终止,也可以让客户端使用close-output-port
关闭它。
将您的客户端代码转换为:
(define (hello_socket port)
(define-values (in out) (tcp-connect "localhost" port))
(write "hello socket world\n" out)
(close-output-port out)
(display (read in)))
通过此更改运行客户端(服务器处于活动状态)会导致预期的行为:
> (thread (lambda () (hello_listen 1337)))
> (hello_socket 1337)
"hello socket world\n"