package com.ld.igds.weather; import com.ld.igds.util.BytesUtil; import com.ld.io.api.*; import com.ld.io.netty.NettyServer; import lombok.extern.slf4j.Slf4j; import java.util.List; /** * @Desc: 气象站对外接口,需要通过TCP/IP对接,对接协议按照控制柜对外粮情协议模式生成。 * @author: Andy * @update-time: 2023/4/23 */ @Slf4j public class WeatherServerEngine { public static final int PORT = 9308; public static NettyServer ioServer = null; // 配置消息接收类 private static MsgConsumer messageConsume = new MsgConsumer(); // 监听会话的创建与销毁 private static SessionListener ioSessionListener = new SessionListener(); public static void start() { start(PORT); } public static void start(int port) { // 配置Server的配置 IoServerOption ioServerOption = new IoServerOption(port); ioServerOption.setSplitDecoderType(SplitByteDecoderType.DELIMITER_SYMBOL); ioServerOption.setDelimiter(BytesUtil.hexStrToBytes(ServerUtils.MSG_END)); ioServer = new NettyServer(ioServerOption, messageConsume, ioSessionListener); ioServer.startup(); log.info("* ========================"); log.info("* "); log.info("* 服务提供对外气象站服务启动成功,端口号={}", port); log.info("* "); log.info("* ========================"); System.out.println("* ========================"); System.out.println("* "); System.out.println("* 服务提供对外气象站服务启动成功,端口号=" + port); System.out.println("* "); System.out.println("* ========================"); } /** * 发送信息 * * @param ip * @param port * @param msg * @return */ public static InvokeResult push(String ip, int port, byte[] msg) { IoSession session = getSession(ip, port); if (null == session) { return InvokeResult.CHANNEL_CLOSED; } return session.invoke(msg); } /** * 发送信息 * * @param msg * @return */ public static InvokeResult push(IoSession session, byte[] msg) { if (null == session) { return InvokeResult.CHANNEL_CLOSED; } return session.invoke(msg); } /** * 主动销毁当前连接 * * @param ip * @param port * @return */ public static InvokeResult destroy(String ip, int port) { IoSession session = getSession(ip, port); if (null == session) { return InvokeResult.SUCCESS; } // 执行连接销毁 session.destroy(); return InvokeResult.SUCCESS; } /** * 根据SessionKey获取Session信息 * * @param ip * @return */ public static IoSession getSession(String ip, int port) { IoSessionQuery sessionFactory = ioServer.getSessionQuery(); List sessions = sessionFactory.getAllSession(); for (IoSession ioSession : sessions) { if (ip.equals(ioSession.getAddress()) && port == ioSession.getPort()) { return ioSession; } } return null; } }