我将如何在 crystal 中设置一个可以与多个客户端通信的简单 unix 套接字服务器?

How would I set up a simple unix socket server in crystal that could communicate with multiple clients?

我正在尝试弄清楚如何在 crystal 中实现 unix 套接字。我希望能够将名称发送到服务器应用程序并让它 return "Hello #{name}."

#server.cr
require "socket"

loop do
  spawn do
    server = UNIXServer.new("/tmp/myapp.sock")
    name = server.gets
    server.puts "Hello #{name}."
  end
end

在客户端我假设我可以有一个循环等待标准输入并通过套接字发送它。

#client.cr
require "socket"

loop do
  sock = UNIXSocket.new("/tmp/myapp.sock")
  puts "What is your name?\n: "
  name = gets
  sock.puts name
  puts sock.gets
  sock.close
end

显然我在这里遗漏了一些重要的东西,但我似乎无法在文档中找到合适的东西来填补空白。 UNIXServer 和 UNIXSocket 之间有什么联系?如果有人可以向我展示我正在尝试做的工作的示例,我将永远感激不已。

更新:这是我的解决方案


事实证明,使用 UNIXServer 并在其上调用 accept 来创建套接字解决了我最初的问题。在我 运行 进入所有光纤都使用相同套接字的问题之后,关闭一个就关闭了所有光纤。可能还有另一种解决方案,但这对我有用。感谢@RX14 的帮助。

#server.cr
require "socket"

server = UNIXServer.new("/tmp/cr.sock")

while sock = server.accept 
  proc = ->(sock : UNIXSocket) do
    spawn do
      name = sock.gets
      unless name == "q"
        puts name
        sock.puts "Hello #{name}."
        sock.close
      else
        server.close
        exit
      end
    end
  end
  proc.call(sock)
end

#client.cr
require "socket"

UNIXSocket.open("/tmp/cr.sock") do |sock|
  puts "What is your name?"
  name = gets
  sock.puts name
  puts sock.gets
  sock.close
end

您需要使用 UNIXServer#acceptUNIXServer#accept? 方法来接受传入连接。

# server.cr
require "socket"

def handle_connection(socket)
  name = socket.gets
  socket.puts "Hello #{name}."
end

server = UNIXServer.new("/tmp/myapp.sock")
while socket = server.accept
  spawn handle_connection(socket)
end

# client.cr
require "socket"

UNIXSocket.open("/tmp/myapp.sock") do |sock|
  puts "What is your name?\n: "
  name = STDIN.gets
  sock.puts name
  puts sock.gets
end