2017-01-18 17 views
1

我試圖在接收數據的球拍上創建一個網絡服務器,並且用它收到的數據來做爲什麼Racket上的網絡服務器不能多次接收數據?

我遇到的問題是,如果客戶端重新運行(單擊運行按鈕),服務器只接收來自客戶端的內容。我真正想要做的是能夠在客戶端控制檯中鍵入(例如)(寫入「test」)多次,並且服務器可以接收它並在服務器文件中的函數中處理數據。

這是我嘗試使其工作的最新嘗試。我正在使用echo-server代碼。但仍然沒有運氣。

(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

你靠近。它只打印一次「測試」的原因是因爲在你讀完一次後,你實際上關閉了輸入端口。這意味着無法從服務器發送更多信息。

相反,如果你在一個繁忙的循環這樣做,又名:

(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

太棒了!非常感謝! –

相關問題