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