Ruby Socket编程等待客户端输入

时间:2014-11-06 16:58:19

标签: ruby

我正在尝试实现一个小脚本,它将创建一个服务器,等待客户端连接,为客户端创建一个新线程,然后处理客户端请求。来自客户端的第一个请求将是HELO文本,服务器必须使用HELO文本,然后是IP地址,端口号和学生编号进行响应。我有点工作。

下一个请求将是任意随机字符串,并且不得返回任何内容。我有点工作。

最后一个请求是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 

2 个答案:

答案 0 :(得分: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)将结束整个过程。

更新:添加了关于如何处理关闭服务器本身的阻止,而不仅仅是连接。

答案 1 :(得分:0)

接受连接后,您需要继续等待来自客户端的输入。

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

当您收到KILL_SERVICE时,您需要使用client.close关闭客户端,并使用while突破break循环。一旦你完成while循环,处理该客户端的线程就会退出。