1. Websockets

Making long-lived client-server connections over a TCP.

1.1. Websocket Server

# src/web_sockets/server.cr
require "http/server"

# track the open websockets
SOCKETS = [] of HTTP::WebSocket

ws_handler = HTTP::WebSocketHandler.new do |socket|
  puts "Socket opened"
  SOCKETS << socket

  # A very simple chat room indeed
  socket.on_message do |message|
    puts message
    SOCKETS.each { |socket| socket.send message }
  end

  # Clean up any references
  socket.on_close do
    SOCKETS.delete(socket)
  end

  # `.run` is called on the WebSocket automatically when this block returns
end

server = HTTP::Server.new([ws_handler])

address = server.bind_tcp "localhost", 3000
puts "Listening on ws://#{address}"
server.listen

1.2. Websocket Client

# src/web_sockets/client.cr
require "http/web_socket"

uri    = URI.parse("ws://localhost:3000")
socket = HTTP::WebSocket.new(uri)
socket.send "Howdy1"

socket.on_message do |message|
  puts message
end

socket.send "Howdy2"

socket.run

socket.send "Howdy2"