使用 Ruby 构建聊天应用程序

问题描述 投票:0回答:1

我正在尝试纯粹使用 Ruby 构建一个聊天应用程序。之前发布了一个类似的问题,但我有不同且相关的查询。我看过这个例子(与之前发布类似问题的人提到的相同)。示例中的代码似乎不适合我。在终端上运行 ruby 脚本并在浏览器中连接到 url:http://localhost:1234 时,我无限期地遇到“从 localhost 传输数据...”消息。

此处 1234 是提供的示例中使用的端口号。我无法弄清楚我跑步失败的原因是什么。可能我需要在执行脚本时在命令行中指定某些内容,或者我应该通过其他地方(可能是浏览器)启动聊天(输入输出)。我不知道到底该怎么做。

我运行的聊天服务器代码几乎没有修改。我在同一主机上运行 Web 服务和聊天服务器。

我能够部分地让代码为我工作,直到循环开始。下面给出了在一定程度上对我有用的修改后的代码。

require 'gserver'

class BasicServer < GServer

  def initialize(*args)
    super(*args)
    
    # Keep an overall record of the client IDs allocated
    # and the lines of chat
    @@client_id = 0
    @@chat = []
  end
  

  def serve(io)
  #  io.puts("Hello world!")
      # Increment the client ID so each client gets a unique ID
    @@client_id += 1
    my_client_id = @@client_id
    my_position = @@chat.size
    

   # io.puts(@@chat.size)    
    # Give the total number of people who are currently on chat.. for e.g. 0 => 1 person on chat    

    # Leave a message on the chat queue to signify this client
    # has joined the chat
    @@chat << [my_client_id, ""]

   # io.puts(@@chat)    

  end

end


server = BasicServer.new(1234)
server.start

#sleep 120
#server.shutdown

对于每个浏览器实例,都有一个新客户端连接到聊天队列(它们具有唯一的客户端 ID 来标识它们)。我想通过向运行的浏览器实例添加一个文本框(类似于我们在 html 中使用的内容)来重用示例中的代码,其中用户可以输入他们的消息并使用单击来发布它一个按钮(也集成在浏览器中)。这反映在各种客户端的所有其他浏览器实例中,并且聊天会像这样继续,直到用户输入字符串“退出”以离开聊天室。

我也不知道如何在 Ruby 中实现上述功能。

ruby chat
1个回答
4
投票

我猜这是您正在使用的唯一代码。 HTTP(您的网络浏览器与服务器通信时使用的协议)的工作方式是,浏览器连接到您的服务器,发送一些行说明它想要获取哪个页面,它有哪些 cookie 等。然后服务器响应,在大多数情况下,关闭连接。因此,在您的情况下,当您在网络浏览器中连接到聊天服务器时,浏览器会连接,

BasicServer#serve
被调用,一些内容被发回,并且网络浏览器关闭连接,因此服务器无法发送更多数据到浏览器。 “修复”此问题的最简单方法是使用不同的方式连接到服务器(telnet 或 nc (netcat))。如果您希望在浏览器中实现此功能,则需要让服务器响应 HTTP 请求,然后返回定期轮询服务器的页面(阅读 AJAX 或 WebSockets)。您可以查看以下内容以获取灵感,尽管它不是用 Ruby 编写的:https://github.com/ry/node_chat

© www.soinside.com 2019 - 2024. All rights reserved.