update folders
This commit is contained in:
28
snipplets/code/Crystal/UNIXSockets/by_faustinoaq/client.cr
Normal file
28
snipplets/code/Crystal/UNIXSockets/by_faustinoaq/client.cr
Normal file
@@ -0,0 +1,28 @@
|
||||
require "socket"
|
||||
|
||||
client = UNIXSocket.new("/tmp/myapp.sock")
|
||||
|
||||
Signal::INT.trap {
|
||||
client.puts "quit"
|
||||
exit
|
||||
}
|
||||
|
||||
print "name: "
|
||||
name = gets.to_s
|
||||
|
||||
spawn {
|
||||
loop {
|
||||
msg = client.gets
|
||||
if msg
|
||||
puts msg
|
||||
else
|
||||
puts "server closed"
|
||||
exit
|
||||
end
|
||||
}
|
||||
}
|
||||
|
||||
loop {
|
||||
msg = gets.to_s
|
||||
client.puts "#{name}: #{msg}"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
https://github.com/crystal-lang/crystal/issues/4277#issuecomment-294009173
|
||||
38
snipplets/code/Crystal/UNIXSockets/by_faustinoaq/server.cr
Normal file
38
snipplets/code/Crystal/UNIXSockets/by_faustinoaq/server.cr
Normal file
@@ -0,0 +1,38 @@
|
||||
require "socket"
|
||||
|
||||
server = UNIXServer.new("/tmp/myapp.sock")
|
||||
CLIENTS = [] of UNIXSocket
|
||||
|
||||
Signal::INT.trap {
|
||||
puts "closing server..."
|
||||
server.close
|
||||
exit
|
||||
}
|
||||
|
||||
def on_message(client)
|
||||
loop {
|
||||
msg = client.gets
|
||||
if msg == "quit"
|
||||
puts "deleting client..."
|
||||
CLIENTS.delete client
|
||||
pp CLIENTS.size
|
||||
break
|
||||
else
|
||||
yield msg
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
loop {
|
||||
puts "waiting for client on /tmp/myapp.sock"
|
||||
new_client = server.accept
|
||||
spawn {
|
||||
on_message(new_client) { |msg|
|
||||
CLIENTS.each { |client|
|
||||
client.puts msg unless client == new_client
|
||||
}
|
||||
}
|
||||
}
|
||||
CLIENTS << new_client
|
||||
pp CLIENTS.size
|
||||
}
|
||||
24
snipplets/code/Crystal/UNIXSockets/client.cr
Normal file
24
snipplets/code/Crystal/UNIXSockets/client.cr
Normal file
@@ -0,0 +1,24 @@
|
||||
require "socket"
|
||||
|
||||
# connect to socket
|
||||
sock = UNIXSocket.new("/tmp/myapp.sock")
|
||||
|
||||
loop do
|
||||
print "Enter command [help, start, run]: "
|
||||
|
||||
# get string from terminal input
|
||||
string = gets.not_nil!.to_s
|
||||
|
||||
if string == "q"
|
||||
break
|
||||
end
|
||||
|
||||
# send string to server
|
||||
sock.puts "#{string}\n"
|
||||
|
||||
# get response from server & print
|
||||
response = sock.gets
|
||||
puts response
|
||||
end
|
||||
|
||||
sock.close
|
||||
46
snipplets/code/Crystal/UNIXSockets/server.cr
Normal file
46
snipplets/code/Crystal/UNIXSockets/server.cr
Normal file
@@ -0,0 +1,46 @@
|
||||
require "socket"
|
||||
require "file_utils"
|
||||
|
||||
SOCKET = "/tmp/myapp.sock"
|
||||
|
||||
begin
|
||||
FileUtils.rm(SOCKET)
|
||||
rescue e : File::NotFoundError
|
||||
end
|
||||
|
||||
server = UNIXServer.new(SOCKET)
|
||||
CLIENTS = [] of UNIXSocket
|
||||
|
||||
Signal::INT.trap do
|
||||
puts "Closing server..."
|
||||
server.close(delete = true)
|
||||
|
||||
exit
|
||||
end
|
||||
|
||||
def handle_client(client)
|
||||
loop do
|
||||
message = client.gets
|
||||
|
||||
p! client
|
||||
|
||||
if message == "start"
|
||||
puts "::request START command::"
|
||||
client.puts "Hello :)"
|
||||
elsif message == "help"
|
||||
puts "::request HELP command::"
|
||||
client.puts "This example ECHO unix server!"
|
||||
elsif message == "run"
|
||||
puts "::request RUN command::"
|
||||
client.puts "Ready, Set, GO!"
|
||||
else
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
puts "Listen..."
|
||||
|
||||
while client = server.accept
|
||||
spawn handle_client(client)
|
||||
end
|
||||
Reference in New Issue
Block a user