netty服務端監聽客戶端連線加入和斷開事件
package com.ahies.stm.app.gatenetty;
import com.ahies.stm.app.centerControl.object.protocol.ControlProtocol;
import com.ahies.stm.app.centerControl.object.service.ControlObjectService;
import com.ahies.stm.app.synthesizes.appoint.service.AppointMemberService;
import com.ahies.stm.app.ticketsys.gatenetty.GatelProtocol;
import com.ahies.stm.app.util.HexUtil;
import com.ahies.stm.app.util.SpringContextUtil;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.Attribute;
import io.netty.util.AttributeKey;
import io.netty.util.concurrent.GlobalEventExecutor;
import java.net.InetSocketAddress;
public class GateTcpServerHandler extends SimpleChannelInboundHandler<Object> {
public static ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
@Override
protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
// 用於獲取客戶端發來的資料資訊
GatelProtocol body = (GatelProtocol) msg;
System.out.println("接收到客戶端發來的訊息=="+msg.toString());
AppointMemberService appointMemberService = (AppointMemberService) SpringContextUtil.getBean(AppointMemberService.class);
appointMemberService.handleMsg(body,ctx);
}
/**
* 當有客戶端連線時,handlerAdded會執行,就把該客戶端的通道記錄下來,加入佇列
*連線第1步
* @param ctx
* @throws Exception
*/
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
Channel inComing = ctx.channel();//獲得客戶端通道
//通知其他客戶端有新人進入
channels.add(inComing);//加入佇列
super.handlerAdded(ctx);
}
// 連線第2步
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
Channel inComing = ctx.channel();
AttributeKey<String> host_channel_key = AttributeKey.valueOf("channel-host");
Attribute<String> attr = inComing.attr(host_channel_key);
InetSocketAddress socketAddress = (InetSocketAddress) inComing.remoteAddress();
String host = socketAddress.getHostString();
attr.set(host);
System.out.println("[" + inComing.remoteAddress() + "]: 線上");
super.channelActive(ctx);
}
// 斷開連線 第1步
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
Channel inComing = ctx.channel();
System.out.println("[" + inComing.remoteAddress() + "]: 離線");
super.channelInactive(ctx);
}
/**
* 斷開連線 第2步
*
* @param ctx
* @throws Exception
*/
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
Channel outComing = ctx.channel();//獲得客戶端通道
channels.remove(outComing);
super.handlerRemoved(ctx);
ctx.channel().close();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
System.out.println("exceptionCaught!" + cause);
cause.printStackTrace();
channels.remove(ctx.channel());
ctx.close();
}
}
相關文章
- java netty 實現 websocket 服務端和客戶端雙向通訊 實現心跳和斷線重連 完整示例JavaNettyWeb服務端客戶端
- Netty入門系列(1) --使用Netty搭建服務端和客戶端Netty服務端客戶端
- 【LISTENER】Oracle分析連線監聽情況,判斷客戶端IP分佈Oracle客戶端
- TCP協議服務端和客戶端的連線與通訊TCP協議服務端客戶端
- 客戶端,服務端客戶端服務端
- 服務端,客戶端服務端客戶端
- 服務端渲染和客戶端渲染服務端客戶端
- python建立tcp服務端和客戶端PythonTCP服務端客戶端
- Java服務端和客戶端開發輔助工具UtilsJava服務端客戶端
- impala客戶端連線客戶端
- Redis客戶端連線Redis客戶端
- MQTT伺服器搭建服務端和客戶端MQQT伺服器服務端客戶端
- 模板,從服務端到客戶端服務端客戶端
- Qt TCP通訊客戶端斷開連線有哪些方法QTTCP客戶端
- TCP程式設計之服務端和客戶端的開發TCP程式設計服務端客戶端
- PLSQL Developer 客戶端沒有TNS監聽,無法連線資料庫SQLDeveloper客戶端資料庫
- 使用Apollo Server搭建GraphQL的服務端和客戶端Server服務端客戶端
- Eureka高可用叢集服務端和客戶端配置服務端客戶端
- Java 客戶端 Jedis和JedisPool 連線池Java客戶端
- 遠端客戶端連線資料庫時提示TNS-12541: TNS: 無監聽程式客戶端資料庫
- Go基於gRPC實現客戶端連入服務端GoRPC客戶端服務端
- ZooKeeper服務發現客戶端--重連認證客戶端
- 服務端c100k連線測試和客戶端65535測試驗證2服務端客戶端
- mysql、redis 客戶端連線池MySqlRedis客戶端
- vncserver建立與客戶端連線VNCServer客戶端
- ZooKeeper服務發現客戶端客戶端
- OSSEC服務端配置客戶端批次部署方案服務端客戶端
- golang實現tcp客戶端服務端程式GolangTCP客戶端服務端
- 中斷客戶端客戶端
- Oracle 10g RAC客戶端配置監聽Oracle 10g客戶端
- MongoDB系列一:MongoDB安裝、啟動關閉服務、客戶端連線MongoDB客戶端
- 【2】Windows C++ Redis服務端搭建與客戶端開發WindowsC++Redis服務端客戶端
- netty建立數萬客戶端連線,並主動發訊息Netty客戶端
- macOS 自帶的ftp服務端&vnc客戶端MacFTP服務端VNC客戶端
- .Net Remoting服務端與客戶端呼叫示例REM服務端客戶端
- Rest Post示例(java服務端、python客戶端)RESTJava服務端Python客戶端
- Android實現Thrift服務端與客戶端Android服務端客戶端
- rsync備份【基於客戶端與服務端】客戶端服務端