socket alternatives and similar packages
Based on the "Networking" category.
Alternatively, view socket alternatives based on common mentions on social networks and blogs.
-
Firezone
Open-source VPN server and egress firewall for Linux built on WireGuard. Firezone is easy to set up (all dependencies are bundled thanks to Chef Omnibus), secure, performant, and self hostable. -
Ockam
Orchestrate end-to-end encryption, cryptographic identities, mutual authentication, and authorization policies between distributed applications – at massive scale. -
sshkit
An Elixir toolkit for performing tasks on one or more servers, built on top of Erlang’s SSH application. -
wifi
Various utility functions for working with the local Wifi network in Elixir. These functions are mostly useful in scripts that could benefit from knowing the current location of the computer or the Wifi surroundings.
CodeRabbit: AI Code Reviews for Developers
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of socket or a related project?
Popular Comparisons
README
Elixir sockets made decent
This library wraps gen_tcp
, gen_udp
and gen_sctp
, ssl
and implements
websockets and socks.
Installation
In your mix.exs
file
defp deps do
[
# ...
{:socket, "~> 0.3"},
# ...
]
end
Then run mix deps.get
to install
Examples
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\nHost: #{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
Websockets
Client
socket = Socket.Web.connect! "echo.websocket.org"
socket |> Socket.Web.send! { :text, "test" }
socket |> Socket.Web.recv! # => {:text, "test"}
In order to connect to a TLS websocket, use the secure: true
option:
socket = Socket.Web.connect! "echo.websocket.org", secure: true
The connect!
function also accepts other parameters, most notably the path
parameter, which is used when the websocket server endpoint exists on a path below the domain ie. "example.com/websocket":
socket = Socket.Web.connect! "example.com", path: "/websocket"
Note that websocket servers send ping messages. A pong reply from your client tells the server to keep the connection open and to send more data. If your client doesn't send a pong reply then the server will close the connection. Here's an example of how to get get both the data you want and reply to a server's pings:
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
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!)