defmodule TaskyRabbit.Socket do
use GenServer
defmodule State do
defstruct port: nil, lsock: nil, socket: nil
end
#######
# API #
#######
def start_link(port) do
GenServer.start_link(__MODULE__, port, name: __MODULE__)
end
def init(port) do
IO.puts(port)
current = self()
# tcp_options = [:binaries, {:packet, 0}, {:active, false}, {:reuseaddr, true}]
# tcp_options = [:binary, packet: 0, active: false, reuseaddr: true]
{:ok, l_socket} = :gen_tcp.listen(port, [:binary, {:packet, 4}, {:packet, :line}, active: false, reuseaddr: true])
send(current, :accept)
{:ok, %State{port: port, socket: l_socket}}
end
def handle_info(:accept, state = %{socket: socket}) do
do_listen(socket)
{:noreply, state}
end
defp do_listen(l_socket) do
{:ok, socket} = :gen_tcp.accept(l_socket)
spawn(fn() -> do_server(socket) end)
do_listen(l_socket)
end
defp do_server(socket, string \\ "") do
case :gen_tcp.recv(socket, 0) do
{ :ok, data } ->
case message = Poison.Parser.parse(data) do
{:ok, json} ->
IO.puts "good"
{:error, :invalid, t} ->
new_string = "#{string}#{data}"
do_server(socket, data)
{:error, {:invalid, t, _}} ->
do_server(socket, data)
end
IO.inspect (data), label: "received"
# TaskyRabbit.tcp_rbmq(data)
{ :error, :closed } ->
IO.inspect "closed"
:ok
end
end
end