Pustaka ini membungkus gen_tcp , gen_udp dan gen_sctp , ssl serta mengimplementasikan websockets dan socks.
Di file mix.exs Anda
defp deps do
[
# ...
{:socket, "~> 0.3"},
# ...
]
end
Kemudian jalankan mix deps.get untuk menginstal
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"} Untuk terhubung ke soket web TLS, gunakan opsi secure: true :
socket = Socket.Web . connect! "echo.websocket.org" , secure: true connect! fungsi juga menerima parameter lain, terutama parameter path , yang digunakan ketika titik akhir server websocket ada pada jalur di bawah domain yaitu. "example.com/websocket":
socket = Socket.Web . connect! "example.com" , path: "/websocket"Perhatikan bahwa server websocket mengirim pesan ping. Balasan pong dari klien Anda memberitahu server untuk menjaga koneksi tetap terbuka dan mengirim lebih banyak data. Jika klien Anda tidak mengirimkan balasan pong maka server akan menutup koneksi. Berikut ini contoh cara mendapatkan data yang Anda inginkan dan membalas ping server:
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! )