我将如何在 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#accept
或 UNIXServer#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
我正在尝试弄清楚如何在 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#accept
或 UNIXServer#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