나는 Cowboy websocket 서버를 가지고 있으며 gen_event 핸들러를 등록하여 websocket을 통해 뭔가를 보내고 싶습니다. 또한 websocket_handle/3
으로 정규 동기 요청에 응답 할 수 있어야합니다. cowboy_http_websocket_handler.erl에서 아무 것도 보이지 않았고 cowboy_http_websocket:websocket_send/3을 내보낼 수 없습니다. 내가 오픈 소켓을 통해 뭔가를 보낼 수있는 쉬운 방법을 놓치고 있습니까?카우보이와 웹 소켓을 통해 비동기 적으로 데이터를 보내려면 어떻게해야합니까?
답변
the example websocket handler에서 websocket_info/3은 이와 같은 자료를 보내는 데 사용됩니다. websocket_info/3을 사용하여 websocket의 초기화 코드에 gen_event:add_sup_handler/3을 결합하십시오. 연결의 pid를 핸들러의 상태로 유지하고 비동기 이벤트와 함께 메시지를 보냅니다.
오래 전이 답변을 알고 있지만 질문이 있습니다 ... 왜 당신은 카우보이 응용 프로그램의 시작이 아니라 websocket의 int 코드에 이벤트 처리기를 추가합니까? –
세션이 설정되면 websocket의 초기화 코드가 실행됩니다. 카우보이는 한 번만 초기화됩니다. 이 연결을 열려면 메시지를 보내야하며, 응용 프로그램을 시작할 때 미래 연결에 대한 pid 알 수 없습니다. 즉, 새로운 버전의 카우보이가 출시되었으므로 이것이 쓸모 없게 될 수도 있습니다. – nmichaels
나는 너와 비슷한 문제가 있었는데 해결 방법을 추가했다.나를 올바른 방향으로 가리켜 주셔서 감사합니다. 비슷한 문제에 직면 한 다른 사람에게 유용 할 수 있습니다. –
@nmichaels 대답은 올바른 방향으로 나를 가리켰다. 그리고 나는 내부 메시지를 websocket_info에 보내는 카우보이 앱에서 gen_event를 성공적으로 사용했다. 그러나 대답은 약간 날짜가 나고 카우보이가 많이 바뀌었기 때문에 최신 카우보이 버전에서 작동하는 솔루션을 추가하고 싶습니다. 다행히도 이것은 얼랑 (Erlang)과 카우보이에 새로운 도움이되기를 바랍니다.
카우보이의 gen_event을 구현하기 위해 필요한 세 가지 단계
gen_event를 시작하고 당신이 핸들러 나는 세계적으로 이벤트라고 my_events를 등록한 다음
start(_Type, _Args) -> Dispatch = cowboy_router:compile(wrinqle_routes:routes_configuration()), {ok, _} = cowboy:start_http(http, 100, [{port, 3000}], [{env, [{dispatch, Dispatch}]}]), pg2:start(), gen_event:start({global,my_events}), gen_event:add_handler({global,my_events},my_event_handler,[]).
이벤트 처리기를 만듭니다.
이제 이벤트 처리기에 카우보이의 모든 위치에서 이벤트를 알릴 수 있습니다. 예를 들어 아래 코드는 websocket_handler
{ _,_ }-> gen_event: notify(global:whereis_name(my_events),{event_name,self()}), {ok,Req,State};
이 모든 코드는 전 세계적으로 이벤트의 my_events에 등록 이벤트를 통지한다하고있다에서 이벤트를 발생시킵니다. 그게 전부 야.
OP에 문제가있는 또 다른 문제는 초기화 할 때 pid를 알 수없는 연결 및 연결을 여는 메시지를 보내는 방법이었습니다. 이 문제를 해결하기 위해 채널 아래에 프로세스 ID를 등록하는 pg2을 사용할 수 있습니다. PID 관리를위한 매우 유용한 모듈입니다. 그래서 위의 코드는이
[H|T] = pg2:get_members(Name)
gen_event: notify(global:whereis_name(my_events),{event_name, H}).
같은 것을로 변환 할 수 있습니다 그리고이 방법은 특정 소켓에 특정 PID와에 의해 확장에 메시지를 보낼 수 있습니다.
- 1. GWT - 비동기 적으로 양식을 보내려면 어떻게해야합니까?
- 2. 클라이언트 이벤트를 비동기 적으로 GtkWidget으로 보내려면 어떻게해야합니까?
- 3. 소켓을 특수 메시지 터미네이터와 비동기 적으로 읽음
- 4. PHP가 소켓을 비동기 적으로 사용할 수 있습니까?
- 5. NServiceBus - 웹 서비스를 통해 NSB를 호출하지만 비동기 적으로 어떻게해야합니까?
- 6. MVC 3 애플리케이션에서 이메일을 비동기 적으로 보내려면 어떻게해야합니까?
- 7. url.openStream()을 통해 POST 데이터를 보내려면 어떻게해야합니까?
- 8. GET 방법을 통해 데이터를 보내려면 어떻게해야합니까?
- 9. TCP/IP 소켓을 사용하여 VB.NET에서 여러 IP로 데이터를 보내려면 어떻게해야합니까?
- 10. C#으로 소켓을 통해 클라이언트에 쿠키를 보내려면 어떻게해야합니까?
- 11. 웹 소켓을 통해 동적 파일의 내용을 스트리밍
- 12. 16 진수 데이터를 보내려면 어떻게해야합니까?
- 13. Javascript와 Delphi간에 데이터를 보내려면 어떻게해야합니까?
- 14. Python과 비동기 적으로 소켓을 받고 응답하는 방법은 무엇입니까?
- 15. 코코아 스트림에서 비동기 적으로 쓰기
- 16. Python urllib을 통해 JSON 데이터를 Django 앱에 보내려면 어떻게해야합니까?
- 17. GridView가 CollectionViewSource를 통해 비동기 적으로 검색된 데이터를 표시하지 않습니다.
- 18. 소켓을 통해 데이터를 보내고 받으십시오.
- 19. rabbitmq에 다른 데이터를 보내려면 어떻게해야합니까?
- 20. 데이터를 중앙 영역으로 보내려면 어떻게해야합니까?
- 21. 새 활동으로 데이터를 보내려면 어떻게해야합니까?
- 22. JavaScript에서 PHP로 데이터를 보내려면 어떻게해야합니까?
- 23. JSON으로 데이터를 Sqlite로 보내려면 어떻게해야합니까?
- 24. 사용자 데이터를 jqGrid로 보내려면 어떻게해야합니까?
- 25. gprs를 통해 이메일을 보내려면 어떻게해야합니까?
- 26. 여러 소스에서 비동기 적으로 ASP.NET GridView를로드하려면 어떻게해야합니까?
- 27. 설정 블루투스 연결을 통해 정보를 보내려면 어떻게해야합니까?
- 28. 유닉스 소켓을 통해 Sinatra 웹 응용 프로그램과 통신하려면 어떻게해야합니까?
- 29. odata v2를 통해 계층 적 데이터를 보내려면 어떻게해야합니까?
- 30. JavaScript를 사용하여 비동기 적으로 웹 페이지에 이미지로드
이 주제에 답하는 가장 쉬운 방법은 cowboy의 github에서 질문하고 작성자에게 질문하는 것입니다. Loïc Hoguin은 토론의 장이 열려 있습니다. – W55tKQbuRu28Q4xv