From f3db92c3b486d40f8ed41e96d10973f5745beae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E7=8B=97?= <909275705@qq.com> Date: Fri, 8 Apr 2022 21:02:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9websocket=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/WebsocketTransferHandler.java | 145 +++++++++--------- 1 file changed, 71 insertions(+), 74 deletions(-) diff --git a/landlords-server/src/main/java/org/nico/ratel/landlords/server/handler/WebsocketTransferHandler.java b/landlords-server/src/main/java/org/nico/ratel/landlords/server/handler/WebsocketTransferHandler.java index d6f2173..631d714 100644 --- a/landlords-server/src/main/java/org/nico/ratel/landlords/server/handler/WebsocketTransferHandler.java +++ b/landlords-server/src/main/java/org/nico/ratel/landlords/server/handler/WebsocketTransferHandler.java @@ -5,6 +5,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; +import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; import org.nico.ratel.landlords.channel.ChannelUtils; @@ -24,80 +25,76 @@ import java.util.Objects; public class WebsocketTransferHandler extends SimpleChannelInboundHandler { - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - Channel ch = ctx.channel(); - - //init client info - ClientSide clientSide = new ClientSide(getId(ctx.channel()), ClientStatus.TO_CHOOSE, ch); - clientSide.setNickname(String.valueOf(clientSide.getId())); - clientSide.setRole(ClientRole.PLAYER); - - ServerContains.CLIENT_SIDE_MAP.put(clientSide.getId(), clientSide); - SimplePrinter.serverLog("Has client connect to the server:" + clientSide.getId()); - new Thread(()->{ - try { - Thread.sleep(2000L); - ChannelUtils.pushToClient(ch, ClientEventCode.CODE_CLIENT_CONNECT, String.valueOf(clientSide.getId())); - ChannelUtils.pushToClient(ch, ClientEventCode.CODE_CLIENT_NICKNAME_SET, null); - } catch (InterruptedException ignored) { - } - }).start(); - } - - @Override - protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame frame) throws Exception { - Msg msg = JsonUtils.fromJson(frame.text(), Msg.class); - ServerEventCode code = ServerEventCode.valueOf(msg.getCode()); - if (! Objects.equals(code, ServerEventCode.CODE_CLIENT_HEAD_BEAT)){ - ClientSide client = ServerContains.CLIENT_SIDE_MAP.get(getId(ctx.channel())); - SimplePrinter.serverLog(client.getId() + " | " + client.getNickname() + " do:" + code.getMsg()); - ServerEventListener.get(code).call(client, msg.getData()); - } - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - if(cause instanceof java.io.IOException) { - clientOfflineEvent(ctx.channel()); - }else { - SimplePrinter.serverLog("ERROR:" + cause.getMessage()); - cause.printStackTrace(); - } - } - - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { - if (evt instanceof IdleStateEvent) { - IdleStateEvent event = (IdleStateEvent) evt; - if (event.state() == IdleState.READER_IDLE) { - try{ - clientOfflineEvent(ctx.channel()); - ctx.channel().close(); - }catch(Exception e){ - } - } - } else { - super.userEventTriggered(ctx, evt); - } - } - - private int getId(Channel channel){ - String longId = channel.id().asLongText(); - Integer clientId = ServerContains.CHANNEL_ID_MAP.get(longId); - if(null == clientId){ - clientId = ServerContains.getClientId(); - ServerContains.CHANNEL_ID_MAP.put(longId, clientId); - } - return clientId; + @Override + protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame frame) throws Exception { + Msg msg = JsonUtils.fromJson(frame.text(), Msg.class); + ServerEventCode code = ServerEventCode.valueOf(msg.getCode()); + if (!Objects.equals(code, ServerEventCode.CODE_CLIENT_HEAD_BEAT)) { + ClientSide client = ServerContains.CLIENT_SIDE_MAP.get(getId(ctx.channel())); + SimplePrinter.serverLog(client.getId() + " | " + client.getNickname() + " do:" + code.getMsg()); + ServerEventListener.get(code).call(client, msg.getData()); + } } - - private void clientOfflineEvent(Channel channel){ - int clientId = getId(channel); - ClientSide client = ServerContains.CLIENT_SIDE_MAP.get(clientId); - if(client != null) { - SimplePrinter.serverLog("Has client exit to the server:" + clientId + " | " + client.getNickname()); - ServerEventListener.get(ServerEventCode.CODE_CLIENT_OFFLINE).call(client, null); - } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + if (cause instanceof java.io.IOException) { + clientOfflineEvent(ctx.channel()); + } else { + SimplePrinter.serverLog("ERROR:" + cause.getMessage()); + cause.printStackTrace(); + } + } + + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + if (evt instanceof IdleStateEvent) { + IdleStateEvent event = (IdleStateEvent) evt; + if (event.state() == IdleState.READER_IDLE) { + try { + clientOfflineEvent(ctx.channel()); + ctx.channel().close(); + } catch (Exception e) { + } + } + } else if (evt instanceof WebSocketServerProtocolHandler.HandshakeComplete) { + Channel ch = ctx.channel(); + // init client info + ClientSide clientSide = new ClientSide(getId(ctx.channel()), ClientStatus.TO_CHOOSE, ch); + clientSide.setNickname(String.valueOf(clientSide.getId())); + clientSide.setRole(ClientRole.PLAYER); + + ServerContains.CLIENT_SIDE_MAP.put(clientSide.getId(), clientSide); + SimplePrinter.serverLog("Has client connect to the server:" + clientSide.getId()); + new Thread(() -> { + try { + Thread.sleep(2000L); + ChannelUtils.pushToClient(ch, ClientEventCode.CODE_CLIENT_CONNECT, String.valueOf(clientSide.getId())); + ChannelUtils.pushToClient(ch, ClientEventCode.CODE_CLIENT_NICKNAME_SET, null); + } catch (InterruptedException ignored) { + } + }).start(); + } else { + super.userEventTriggered(ctx, evt); + } + } + + private int getId(Channel channel) { + String longId = channel.id().asLongText(); + Integer clientId = ServerContains.CHANNEL_ID_MAP.get(longId); + if (null == clientId) { + clientId = ServerContains.getClientId(); + ServerContains.CHANNEL_ID_MAP.put(longId, clientId); + } + return clientId; + } + + private void clientOfflineEvent(Channel channel) { + int clientId = getId(channel); + ClientSide client = ServerContains.CLIENT_SIDE_MAP.get(clientId); + if (client != null) { + SimplePrinter.serverLog("Has client exit to the server:" + clientId + " | " + client.getNickname()); + ServerEventListener.get(ServerEventCode.CODE_CLIENT_OFFLINE).call(client, null); + } } }