elixir socket
1.0.0
ไลบรารีนี้จะล้อม gen_tcp
, gen_udp
และ gen_sctp
, ssl
และใช้ websockets และถุงเท้า
ในไฟล์ mix.exs
ของคุณ
defp deps do
[
# ...
{:socket, "~> 0.3"},
# ...
]
end
จากนั้นรัน mix deps.get
เพื่อติดตั้ง
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"}
ในการเชื่อมต่อกับเว็บซ็อกเก็ต TLS ให้ใช้ตัวเลือก secure: true
:
socket = Socket.Web . connect! "echo.websocket.org" , secure: true
connect!
ฟังก์ชั่นยังยอมรับพารามิเตอร์อื่นๆ โดยเฉพาะอย่างยิ่งพารามิเตอร์ path
ซึ่งใช้เมื่อมีจุดสิ้นสุดของเซิร์ฟเวอร์ websocket บนเส้นทางด้านล่างโดเมน เช่น "example.com/websocket":
socket = Socket.Web . connect! "example.com" , path: "/websocket"
โปรดทราบว่าเซิร์ฟเวอร์ websocket ส่งข้อความ ping การตอบกลับแบบ Pong จากไคลเอนต์ของคุณจะบอกเซิร์ฟเวอร์ให้เปิดการเชื่อมต่อไว้และส่งข้อมูลเพิ่มเติม หากไคลเอนต์ของคุณไม่ส่งคำตอบแบบ Pong เซิร์ฟเวอร์จะปิดการเชื่อมต่อ ต่อไปนี้คือตัวอย่างวิธีรับทั้งข้อมูลที่คุณต้องการและตอบกลับ Ping ของเซิร์ฟเวอร์:
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! )