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! )