32 lines
763 B
Elixir
32 lines
763 B
Elixir
|
defmodule ChatClient do
|
||
|
use GenServer
|
||
|
require Logger
|
||
|
|
||
|
def start_link(socket) do
|
||
|
GenServer.start_link(__MODULE__, socket)
|
||
|
end
|
||
|
|
||
|
def init(socket) do
|
||
|
:inet.setopts(socket, active: :once)
|
||
|
{:ok, %{socket: socket}}
|
||
|
end
|
||
|
|
||
|
def handle_info({:tcp, socket, data}, state) do
|
||
|
Logger.info("Received message: #{inspect(data)}")
|
||
|
ChatServer.broadcast(data)
|
||
|
:inet.setopts(socket, active: :once)
|
||
|
{:noreply, state}
|
||
|
end
|
||
|
|
||
|
def handle_info({:tcp_closed, _socket}, state) do
|
||
|
Logger.info("Client disconnected: #{inspect(state.socket)}")
|
||
|
ChatServer.remove_client(self())
|
||
|
{:stop, :normal, state}
|
||
|
end
|
||
|
|
||
|
def handle_info({:send_data, data}, %{socket: socket} = state) do
|
||
|
:gen_tcp.send(socket, data)
|
||
|
{:noreply, state}
|
||
|
end
|
||
|
end
|