2017-01-18 2 views
1

Я пытаюсь создать сетевой сервер на Racket, который получает данные и делает что-то с данными, которые он получает.Почему мой сетевой сервер на 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

Вы близки. Причина, по которой он только распечатывает «тест» один раз, заключается в том, что вы фактически закрываете входной порт после того, как вы его прочитали один раз. Это означает, что с сервера не может быть отправлено больше информации.

Если вместо того, чтобы вы сделали это в шумном цикле, иначе:

(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 (приведенный в документах racket).

+0

Блестящий! Спасибо огромное! –

Смежные вопросы