MapleServerHandler.java
上传用户:gwt600
上传日期:2021-06-03
资源大小:704k
文件大小:7k
源码类别:

游戏

开发平台:

Java

  1. /*
  2. This file is part of the OdinMS Maple Story Server
  3. Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc> 
  4. Matthias Butz <matze@odinms.de>
  5. Jan Christian Meyer <vimes@odinms.de>
  6. This program is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU Affero General Public License version 3
  8. as published by the Free Software Foundation. You may not use, modify
  9. or distribute this program under any other version of the
  10. GNU Affero General Public License.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU Affero General Public License for more details.
  15. You should have received a copy of the GNU Affero General Public License
  16. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17.  */
  18. package net.sf.odinms.net;
  19. import net.sf.odinms.client.MapleClient;
  20. import net.sf.odinms.net.channel.ChannelServer;
  21. import net.sf.odinms.net.login.LoginWorker;
  22. import net.sf.odinms.tools.HexTool;
  23. import net.sf.odinms.tools.MapleAESOFB;
  24. import net.sf.odinms.tools.MaplePacketCreator;
  25. import net.sf.odinms.tools.data.input.ByteArrayByteStream;
  26. import net.sf.odinms.tools.data.input.GenericSeekableLittleEndianAccessor;
  27. import net.sf.odinms.tools.data.input.SeekableLittleEndianAccessor;
  28. import org.apache.mina.common.IdleStatus;
  29. import org.apache.mina.common.IoHandlerAdapter;
  30. import org.apache.mina.common.IoSession;
  31. import org.slf4j.Logger;
  32. import org.slf4j.LoggerFactory;
  33. public class MapleServerHandler extends IoHandlerAdapter {
  34.     private final static Logger log = LoggerFactory.getLogger(MapleServerHandler.class);
  35.     private final static short MAPLE_VERSION = 62;
  36.     private PacketProcessor processor;
  37.     private int channel = -1;
  38.     private boolean trace = false;
  39.     private Object sb;
  40.     public MapleServerHandler(PacketProcessor processor) {
  41.         this.processor = processor;
  42.     }
  43.     public MapleServerHandler(PacketProcessor processor, int channel) {
  44.         this.processor = processor;
  45.         this.channel = channel;
  46.     }
  47.     @Override
  48.     public void messageSent(IoSession session, Object message) throws Exception {
  49.         Runnable r = ((MaplePacket) message).getOnSend();
  50.         if (r != null) {
  51.             r.run();
  52.         }
  53.         super.messageSent(session, message);
  54.     }
  55.     @Override
  56. public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
  57. }
  58.     @Override
  59.     public void sessionOpened(IoSession session) throws Exception {//打开连接
  60. System.out.println("连接:"+ session.getRemoteAddress()+" 打开.");
  61. if (channel > -1) {
  62. if (ChannelServer.getInstance(channel).isShutdown()) {
  63. session.close();
  64. return;
  65. }
  66. }
  67. byte key[] = { 0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, (byte) 0xB4, 0x00, 0x00,
  68. 0x00, 0x1B, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00 };
  69. byte ivRecv[] = { 70, 114, 122, 82 };
  70. byte ivSend[] = { 82, 48, 120, 115 };
  71. ivRecv[3] = (byte) (Math.random() * 255);
  72. ivSend[3] = (byte) (Math.random() * 255);
  73. MapleAESOFB sendCypher = new MapleAESOFB(key, ivSend, (short) (0xFFFF - MAPLE_VERSION));
  74. MapleAESOFB recvCypher = new MapleAESOFB(key, ivRecv, MAPLE_VERSION);
  75. MapleClient client = new MapleClient(sendCypher, recvCypher, session);
  76. client.setChannel(channel);
  77. session.write(MaplePacketCreator.getHello(MAPLE_VERSION, ivSend, ivRecv, false));
  78. session.setAttribute(MapleClient.CLIENT_KEY, client);
  79. session.setIdleTime(IdleStatus.READER_IDLE, 30);
  80. session.setIdleTime(IdleStatus.WRITER_IDLE, 30);
  81. }
  82.     @Override
  83.     public void sessionClosed(IoSession session) throws Exception {
  84.         synchronized (session) {
  85.             MapleClient client = (MapleClient) session.getAttribute(MapleClient.CLIENT_KEY);
  86.             if (client != null) {
  87.                 client.disconnect();
  88.                 LoginWorker.getInstance().deregisterClient(client);
  89.                 session.removeAttribute(MapleClient.CLIENT_KEY);
  90.             }
  91.         }
  92.         super.sessionClosed(session);
  93.     }
  94.     @Override
  95.     public void messageReceived(IoSession session, Object message) throws Exception {
  96.         byte[] content = (byte[]) message;
  97.         SeekableLittleEndianAccessor slea = new GenericSeekableLittleEndianAccessor(new ByteArrayByteStream(content));
  98.         short packetId = slea.readShort();
  99.         MapleClient client = (MapleClient) session.getAttribute(MapleClient.CLIENT_KEY);
  100.         MaplePacketHandler packetHandler = processor.getHandler(packetId);
  101.         // HexTool#toSting on large buffers is rather expensive - so only do it when we really need to
  102.         if (log.isTraceEnabled() || log.isInfoEnabled()) {
  103.             String from = "";
  104.             if (client.getPlayer() != null) {
  105.                 from = "从 " + client.getPlayer().getName() + " ";
  106.             }
  107.             /*
  108.             if (packetHandler == null) {
  109.                 log.info("Got unhandeled Message {} ({}) {}n{}", new Object[]{from, content.length, HexTool.toString(content), HexTool.toStringFromAscii(content)});
  110.             }
  111.             */
  112.         }
  113.         if (packetHandler != null && packetHandler.validateState(client)) {
  114.             try {
  115.                 if (trace) {
  116.                     String from = "";
  117.                     if (client.getPlayer() != null) {
  118.                         from = "从 " + client.getPlayer().getName() + " ";
  119.                     }
  120.                 //log.info("Got Message {}handled by {} ({}) {}n{}", new Object[] { from, packetHandler.getClass().getSimpleName(), content.length, HexTool.toString(content), HexTool.toStringFromAscii(content) });
  121.                 }
  122.                 packetHandler.handlePacket(slea, client);
  123.             } catch (Throwable t) {
  124.                 //log.error(MapleClient.getLogMessage(client, "Exception during processing packet: " + packetHandler.getClass().getName() + ": " + t.getMessage()), t);
  125.             }
  126.         }
  127.     }
  128.     @Override
  129.     public void sessionIdle(final IoSession session, final IdleStatus status) throws Exception {
  130.         MapleClient client = (MapleClient) session.getAttribute(MapleClient.CLIENT_KEY);
  131.         if (client != null && client.getPlayer() != null && log.isTraceEnabled()) {
  132.             log.trace("玩家 {} 到空闲", client.getPlayer().getName());
  133.         }
  134.         if (client != null) {
  135.             client.sendPing();
  136.         }
  137.         super.sessionIdle(session, status);
  138.     }
  139. }