2015-10-12 2 views
3

Я пользуюсь библиотекой elixir-socket. Я хотел бы иметь возможность подключиться к тестовому серверу, работающему в той же среде erlang/elixir, чтобы я мог протестировать отправленные сообщения. когда я пытаюсь использовать сокет elixir для подключения к localhost, я получаю несуществующую ошибку домена.Открытие подключения к серверу на локальном сервере

В качестве примера у меня есть тест, который просто печатает сообщения, которые получает веб-сервер, чтобы проиллюстрировать эту точку.

defmodule MyTest do 
    use ExUnit.Case 

    test "socket" do 
    port = 9999 
    SingleServer.start_link(port) 
    :timer.sleep(2_000) 
    socket = Socket.Web.connect! "0.0.0.0:#{port}" 
    socket |> Socket.Web.send! { :text, "test" } 
    :timer.sleep(2_000) 
    end 

end 


defmodule SingleServer do 
    def start_link(port) do 
    spawn_link __MODULE__, :init, [port] 
    end 

    def init(port) do 
    server = Socket.Web.listen! port 
    client = server |> Socket.Web.accept! 
    client = server |> Socket.Web.accept! 
    client |> Socket.Web.recv! |> IO.inspect 
    end 
end 

ответ

2

На стороне клиента для подключения к хост/использование порта либо двухаргументной connect! или connect! проходящей в паре:

Socket.Web.connect!("localhost", port) 
|> Socket.Web.send!({ :text, "test" }) 

На стороне сервера несколько парадоксально accept!, кажется, делает что-то другое в зависимости от того, передаете ли вы сервер или клиентский сокет. Если вы передаете сервер, он ждет, когда клиент подключится и вернет клиентский сокет. Если вы передаете клиентский сокет, он «принимает» соединение (в отличие от close!), поэтому код на стороне сервера должен быть примерно таким:

server = Socket.Web.listen!(port) 
client = Socket.Web.accept!(server) 
Socket.Web.accept!(client) 

client |> Socket.Web.recv! |> IO.inspect 
Смежные вопросы