Cette bibliothèque encapsule gen_tcp
, gen_udp
et gen_sctp
, ssl
et implémente des websockets et des chaussettes.
Dans votre fichier mix.exs
defp deps do
[
# ...
{:socket, "~> 0.3"},
# ...
]
end
Ensuite, exécutez mix deps.get
pour installer
defmodule HTTP do
def get ( uri ) when is_binary ( uri ) or is_list ( uri ) do
get ( URI . parse ( uri ) )
end
def get ( % URI { host: host , port: port , path: path } ) do
sock = Socket.TCP . connect! host , port , packet: :line
sock |> Socket.Stream . send! "GET #{ path || "/" } HTTP/1.1 r n Host: #{ host } r n r n "
[ _ , code , text ] = Regex . run ~r " HTTP/1.1 (.*?) (.*?) s *$ " , sock |> Socket.Stream . recv!
headers = headers ( [ ] , sock ) |> Enum . into ( % { } )
sock |> Socket . packet! :raw
body = sock |> Socket.Stream . recv! ( String . to_integer ( headers [ "Content-Length" ] ) )
{ { String . to_integer ( code ) , text } , headers , body }
end
defp headers ( acc , sock ) do
case sock |> Socket.Stream . recv! do
" r n " ->
acc
line ->
[ _ , name , value ] = Regex . run ~r / ^(.*?): s *(.*?) s *$ / , line
headers ( [ { name , value } | acc ] , sock )
end
end
end
socket = Socket.Web . connect! "echo.websocket.org"
socket |> Socket.Web . send! { :text , "test" }
socket |> Socket.Web . recv! # => {:text, "test"}
Afin de vous connecter à un websocket TLS, utilisez l'option secure: true
:
socket = Socket.Web . connect! "echo.websocket.org" , secure: true
La connect!
La fonction accepte également d'autres paramètres, notamment le paramètre path
, qui est utilisé lorsque le point de terminaison du serveur websocket existe sur un chemin situé en dessous du domaine, c'est-à-dire. "exemple.com/websocket" :
socket = Socket.Web . connect! "example.com" , path: "/websocket"
Notez que les serveurs Websocket envoient des messages ping. Une réponse pong de votre client indique au serveur de maintenir la connexion ouverte et d'envoyer plus de données. Si votre client n'envoie pas de réponse pong, le serveur fermera la connexion. Voici un exemple de la manière d'obtenir à la fois les données souhaitées et de répondre aux pings d'un serveur :
socket = Socket.Web . connect! "echo.websocket.org"
case socket |> Socket.Web . recv! do
{ :text , data } ->
# process data
{ :ping , _ } - >
socket |> Socket.Web . send! ( { :pong , "" } )
end
server = Socket.Web . listen! 80
client = server |> Socket.Web . accept!
# here you can verify if you want to accept the request or not, call
# `Socket.Web.close!` if you don't want to accept it, or else call
# `Socket.Web.accept!`
client |> Socket.Web . accept!
# echo the first message
client |> Socket.Web . send! ( client |> Socket.Web . recv! )