2014-11-06 2 views
0

Я пытаюсь реализовать небольшой скрипт, который создаст сервер, дождитесь подключения клиента, создаст новый поток для клиента и обработает клиентские запросы. Первый запрос от клиента будет HELO-текстом, и сервер должен ответить текстом HELO, за которым следуют IP-адрес, номер порта и номер студента. У меня это работает.Ruby Socket Programming Waiting for Client Input

Следующим запросом будет любая случайная строка, и это ничего не должно возвращать. У меня это работает.

Последний запрос будет запросом KILL_SERVICE, который должен закрыть сервер. Я не знаю, как это сделать. Другая проблема заключается в том, что моя программа будет работать только с одной командой за раз. Я не знаю, как обращаться с одной командой, а затем ждать следующей команды от клиента. Ниже приведен код сервера. Любая помощь будет оценена по достоинству.

require 'socket'   
port = 8888  
puts "Starting Up Server" 
server = TCPServer.open(port) 

while (client = server.accept) 
    Thread.start do 
    input = client.gets 

    if input.start_with?("HELO") 
     client.puts "#{input}IP:#{client.peeraddr[2]}\nPort:#{port}\nStudentID:[2]\n" 
    elsif input == "KILL_SERVICE\n" 
     client.puts "KILL" 
    else 
     puts input   
    end 
    end 
end 

ответ

0

Как только ваш код оставляет Thread.start блок, поток считается законченным. Если вы хотите, чтобы остаться вам нужно обернуть его в цикле:

while (client = server.accept) 
    Thread.start do 
    client_running = true 

    while (client_running) 
     # ... Your code 
    end 
    end 
end 

Тогда, если любой из этих команд должны остановить поток, установить client_running = false и цикл выхода. Чтобы заставить отключить все это, exit(0) закончит процесс.

Обновление: Добавлен блок о том, как обращаться с выключенным сервером, а не только с соединением.

+0

Большое спасибо за это. Последний вопрос, который у меня есть, - это убить сервер. Сможете ли вы помочь с этим? –

+0

Я обновил это с примечаниями о том, как обрабатывать основной процесс не только один поток. – tadman

0

Вам необходимо продолжать ждать ввода от клиента после принятия соединения.

while (client = server.accept) 
    Thread.start do 
    while input = client.gets 
     # process input 
    end 
    end 
end 

При получении KILL_SERVICE необходимо закрыть клиент с помощью client.close и выйти из цикла while с использованием break. Как только вы выйдете из цикла while, поток, обрабатывающий этот клиент, выйдет.