elixir socket
1.0.0
تغلف هذه المكتبة gen_tcp
و gen_udp
و gen_sctp
و ssl
وتنفذ مآخذ الويب والجوارب.
في ملف 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. يخبر الرد المستمر من عميلك الخادم بإبقاء الاتصال مفتوحًا وإرسال المزيد من البيانات. إذا لم يرسل عميلك ردًا، فسيقوم الخادم بإغلاق الاتصال. فيما يلي مثال لكيفية الحصول على البيانات التي تريدها والرد على أصوات الخادم:
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! )