我正在尝试使用该库来创建websocket客户端
websockex以及 ets
因为我也在phoenix中使用websocket,因为我正在创建该类型的应用程序
client --websocket-->phoenix-->websocket-->third-party server
我的意图是将每个客户端的套接字对象与一个uid一起保存,以便当我从第三方服务器获得响应时,我知道哪个客户端连接到我的phoenix应用程序时,我必须将该消息发送至以保存这些套接字我用ets ...
问题在于,每次我尝试写到表时
** (ArgumentError) argument error
(stdlib) :ets.insert(:sockets, {"uid", "mierda"})
(stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
(iex) lib/iex/evaluator.ex:257: IEx.Evaluator.handle_eval/5
(iex) lib/iex/evaluator.ex:237: IEx.Evaluator.do_eval/3
(iex) lib/iex/evaluator.ex:215: IEx.Evaluator.eval/3
(iex) lib/iex/evaluator.ex:103: IEx.Evaluator.loop/1
(iex) lib/iex/evaluator.ex:27: IEx.Evaluator.init/4
(websocketsample) lib/websocketsample_web/channels/websocket_communicator.ex:29: WebsocketCommunicator.translate/3
(websocketsample) lib/websocketsample_web/channels/timer_channel.ex:15: WebsocketsampleWeb.TimerChannel.handle_in/3
(phoenix) lib/phoenix/channel/server.ex:268: anonymous fn/4 in Phoenix.Channel.Server.handle_info/2
(websocketsample) lib/websocketsample_web/endpoint.ex:1: WebsocketsampleWeb.Endpoint.instrument/4
(stdlib) gen_server.erl:637: :gen_server.try_dispatch/4
(stdlib) gen_server.erl:711: :gen_server.handle_msg/6
在start_link内进行测试,我尝试保存一个值并立即接收它...这没有问题,但是在我的转换函数中,如果我尝试写入该表,则会遇到上述错误。 ..
我什至尝试使用IEx.pry并在这种情况下保存任何内容(以验证问题是否有效,而我的功能不是问题)我无法有效保存值
defmodule WebsocketCommunicator do
use WebSockex
require Logger
require IEx
def start_link(opt \\ []) do
Logger.info("inicializando la tabla")
:ets.new(:sockets,[:named_table,:public])
:ets.insert(:sockets, {"test","this works"})
[{_k,v}] = :ets.lookup(:sockets,"test") #this works ok
Logger.info("valor es #{v}" )
WebSockex.start_link("ws://localhost:8999",__MODULE__,:fake_state,opt)
end
def translate(client,message,socket) do
uid = Ecto.UUID.generate()
IEx.pry()
:ets.insert(:sockets,{uid,socket}) #this fails
#inside pry if I type this also fails
:ets.insert(:sockets,{"something","boom"})
[{_k,v}] = :ets.lookup(:sockets,uid)
Logger.info("valor es #{v}" )
#mensaje = Poison.encode!(%{"uid" => uid, "text"=>message})
WebSockex.send_frame(client, {:text, "doesnt works!!!"})
end
def handle_frame({:text,msg},:fake_state) do
Logger.info("receiving --> #{msg}")
{:ok, :fake_state}
# {:reply,{:text,msg},:fake_state}
end
end
websockex没有使用genserver,所以我不能使用init函数,您知道这可能是这里的问题还是给我一些解决方法?...非常感谢...