正确的方法是不要在您的频道中捕获退出,而是让另一个进程监视您.当你失败时,它可以调用回调.以下是一个可以帮助您入门的代码:

# lib/my_app.ex

children = [

...

worker(ChannelWatcher, [:rooms])

]

# web/channels/room_channel.ex

def join("rooms:", <> id, params, socket) do

uid = socket.assigns.user_id]

:ok = ChannelWatcher.monitor(:rooms, self(), {__MODULE__, :leave, [id, uid]})

{:ok, socket}

end

def leave(room_id, user_id) do

# handle user leaving

end

# lib/my_app/channel_watcher.ex

defmodule ChannelWatcher do

use GenServer

## Client API

def monitor(server_name, pid, mfa) do

GenServer.call(server_name, {:monitor, pid, mfa})

end

def demonitor(server_name, pid) do

GenServer.call(server_name, {:demonitor, pid})

end

## Server API

def start_link(name) do

GenServer.start_link(__MODULE__, [], name: name)

end

def init(_) do

Process.flag(:trap_exit, true)

{:ok, %{channels: HashDict.new()}}

end

def handle_call({:monitor, pid, mfa}, _from, state) do

Process.link(pid)

{:reply, :ok, put_channel(state, pid, mfa)

end

def handle_call({:demonitor, pid}, _from, state) do

case HashDict.fetch(state.channels, pid) do

:error -> {:reply, :ok, state}

{:ok, _mfa} ->

Process.unlink(pid)

{:reply, :ok, drop_channel(state, pid)}

end

end

def handle_info({:EXIT, pid, _reason}, state) do

case HashDict.fetch(state.channels, pid) do

:error -> {:noreply, state}

{:ok, {mod, func, args}} ->

Task.start_link(fn -> apply(mod, func, args) end)

{:noreply, drop_channel(state, pid)}

end

end

defp drop_channel(state, pid) do

%{state | channels: HashDict.delete(state.channels, pid)}}

end

defp put_channel(state, pid, mfa) do

%{state | channels: HashDict.put(channels, pid, mfa)}}

end

end

websocket检测服务器是否断开_websocket – 如何检测用户是否因网络断开而离开Phoenix通道?...相关推荐

  1. 如何检测服务器运行正常运行,一种检测服务器运行状态的方法、装置和系统专利_专利查询 - 天眼查...

    1. 一种检测服务器运行状态的方法,其特征在于,应用于客户端,所述客户端本地保存 有正常服务器信息表和故障服务器信息表;所述正常服务器信息表中存储有当前处于正常 状态的各服务器的标识信息,所述故障服务 ...

  2. socket心跳机制图片_WebSocket心跳检测和重连机制

    1. 心跳重连原由 心跳和重连的目的用一句话概括就是客户端和服务端保证彼此还活着,避免丢包发生. websocket连接断开有以下两种情况: 前端断开 在使用websocket过程中,可能会出现网络断 ...

  3. java如何处理tcp异常断开_(转)TCP连接异常断开检测

    TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...

  4. 采用ipvsadm管理工具,及Keepalived软件检测服务器的状态,搭建负载均衡的高可用集群

    前言 ipvsadm是Linux虚拟服务器的管理命令,是用于设置.维护和检查Linux内核中虚拟服务器列表的命令.Linux虚拟服务器可用于基于两个或更多个节点的集群构建可扩展的网络服务.群集的活动节 ...

  5. python判断ip能否ping通_Python实现检测服务器是否可以ping通的2种方法

    好想在2014结束前再赶出个10篇博文来,~(>_ python检测服务器是否ping通的2种方法 1.第一种比较挫,就是用ping,python调用shell,这个适用于较少的服务器数量,几百 ...

  6. linux—用nc命令监控检测服务器端口

    前端用apache htttpd进行发布(80端口),通过双机负载均衡转发到后端的两个tomcat进行处理(8081和8082端口), 现在需要随时监控这三个端口的情况,一旦down掉需要能够立即告警 ...

  7. python监控服务器是否在线_python检测服务器是否正常

    #!/usr/bin/python # encoding=utf-8 # Filename: net_is_normal.py import os import socket import subpr ...

  8. Python批量检测服务器端口可用性与Socket函数使用

    socket函数 简述 socket又称套间字或者插口,是网络通信中必不可少的工具.有道是:"无socket,不网络".由于socket最早在BSD Unix上使用,而Unix/L ...

  9. java定时器检测状态_java 定时检测服务器端口状态方法(一)

    最近在写运维管理平台的定时检测集群中各台服务器端口开放状态来判断进程状态的定时任务.顺便整理了下java如何检测服务器一个或者多个端口,以及如何加到定时任务中. 一.java中用Socket检测服务器 ...

最新文章

  1. DoubleSlider
  2. 给正在为就业苦恼的应届生
  3. C++ 3 基本数据类型
  4. Hibernate中Session的清理与清空
  5. trouble identification check tree
  6. CDQ 分治解决和点对有关的问题
  7. Mr.J-- jQuery学习笔记(二十)--节点操作方法
  8. JDK源码(9)-Double、Float
  9. C++:定义头文件/定义命名空间
  10. 中南大学MATLAB变量专题/矩阵的建立1-3/4
  11. numpy_absolute函数
  12. 【下载安装】ps软件下载免费中文版及安装详细步骤教程(photoshop软件下载)
  13. 一度智信:如何提高自己的电商店铺权重
  14. 简单理解云桌面的模板,桌面池和虚拟机的概念
  15. Example 3, 4 of variadic templates
  16. 【课程汇总】Hello HarmonyOS系列课程,手把手带你零基础入门
  17. 接口安全WebPackRESTSOAPWSDLWebService
  18. 教师资格报名无法打开
  19. java parcelable_Java Serializable和Parcelable详解及实例代码
  20. OpenCV基于Python霍夫圆检测—标准霍夫圆检测

热门文章

  1. 四、redis的底层数据结构
  2. CocoaPods公有库的创建
  3. Docker监控方案(TIG)的研究与实践之Grafana
  4. [Angularjs]ng-show和ng-hide
  5. Oracle.DataAccess.Client.OracleCommand”的类型初始值设定项引发异常
  6. 浅谈 PHP 神盾的解密过程
  7. Eclipse launch failed.Binary not found解决方案
  8. PHP与SQL注入***(实战篇五)
  9. 健康的身体是一切的保证 - 保护偶的颈椎!
  10. 在 ServiceModel 客户端配置部分中,找不到引用协定“WebServiceSoap”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素找不到与此协定匹配的终结点元素