2017-01-18 3 views
1

私は、データを受信するラケット上にネットワークサーバを作成しようとしています。何かのデータを受信します。Racketのネットワークサーバが何度もデータを受信しないのはなぜですか?

問題は、クライアントが再実行された場合(実行ボタンをクリックした場合)、サーバーはクライアントから何かを受信するだけであるということです。私が実際にやりたいことは、何度もクライアントコンソールに(「テスト」を書いて)入力し、サーバーがそれを受け取り、サーバーファイル上の関数でデータを処理できるようにすることです。

ここでは、私の最新の試み、それを有効にしようとしています。私はエコーサーバーコードを使用しています。しかし、まだ運がありません。

(define listener (tcp-listen 3961)) 

(define (echo-server) 
    (define-values (in out) (tcp-accept listener)) 
    (thread (lambda() 
      (print (read in)) 
      (close-output-port out))) 
    (echo-server)) 

(echo-server) 

クライアント:

(define-values (in out) 
    (tcp-connect "localhost" 3961)) 

(define sendtoserver 
     (lambda() 
     (write "test" out) 
     (flush-output out))) 

答えて

2

あなたが近いです。 「テスト」を1回だけ印刷するのは、入力ポートを一度読み込んだ後に実際に閉じるためです。つまり、サーバーから情報を送信することはできません。

代わり場合は別名、ビジーループでこれをやった:

(let loop() 
    (print (read in)) 
    (loop)) 

をあなたが複数のものを読むことができるだろう。あなたに次のSERVERコードを教えてください。

#lang racket 

(define listener (tcp-listen 3961)) 

(define (echo-server) 
    (define-values (in out) (tcp-accept listener)) 
    (thread (lambda() 
      (let loop() 
       (print (read in)) 
       (loop)))) 
    (echo-server)) 

(echo-server) 

もちろん、サーバースレッドは決して終了しません。だから、ストリームの終わりをチェックしたいかもしれません。次のようなものがあります。

#lang racket 

(define listener (tcp-listen 3961)) 

(define (echo-server) 
    (define-values (in out) (tcp-accept listener)) 
    (thread (lambda() 
      (let loop() 
       (define val (read in)) 
       (print val) 
       (unless (eof-object? val) 
       (loop))))) 
    (echo-server)) 

(echo-server) 

これは、クライアントが最終的に切断されることを前提としています。また、これは堅牢なサーバーではありません。これは、多くのDNS攻撃に対して未だオープンなままであるためです。それらのいくつかを避ける方法については、More: Systems Programming With Racket(ラケットの文書で提供されています)を参照してください。

+0

ブリリアント!どうもありがとうございます! –

関連する問題