wordpress付费商业站,长沙3合1网站建设,成武菏泽网站建设,新手如何建设网站导航#xff1a;从零开始手写mmo游戏从框架到爆炸#xff08;零#xff09;—— 导航-CSDN博客 上一章我们完成了netty服务启动的相关抽象#xff08;https://blog.csdn.net/money9sun/article/details/136025471#xff09;#xff0c;这一章我们再新增一个全…导航从零开始手写mmo游戏从框架到爆炸零—— 导航-CSDN博客 上一章我们完成了netty服务启动的相关抽象https://blog.csdn.net/money9sun/article/details/136025471这一章我们再新增一个全局的服务启动类方便后续扩展。
服务启动
新增的两个类如下 定义一个接口IServer
public interface IServer {/*** 服务启动* throws Exception*/void start() throws Exception;/*** 服务关闭* throws Exception*/void stop() throws Exception;/*** 服务重启* throws Exception*/void restart() throws Exception;}定义实现类 BasicServer
import com.loveprogrammer.base.factory.ServerChannelFactory;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFutureListener;/*** ClassName BasicServer* Description 网络服务启动实现* Author admin* Date 2024/2/4 16:25* Version 1.0*/
public class BasicServer implements IServer{Channel acceptorChannel;Overridepublic void start() throws Exception {acceptorChannel ServerChannelFactory.createAcceptorChannel();acceptorChannel.closeFuture().sync();}Overridepublic void stop() throws Exception {if(acceptorChannel ! null) {acceptorChannel.close().addListener(ChannelFutureListener.CLOSE);}}Overridepublic void restart() throws Exception {stop();start();}
}启动类修改 // 启动类启动try {IServer server new BasicServer();server.start();} catch (Exception e) {LOGGER.error( 服务器启动失败,e);}
网络事件监听器 创建一个类用于监听网络的变化创建一个接口INetworkEventListener里面包含3个方法onConnected/onDisconnected/onExceptionCaught。依然创建在core组件中
public interface INetworkEventListener {/*** 连接建立** param ctx ChannelHandlerContext*/void onConnected(ChannelHandlerContext ctx);/*** 连接断开* * param ctx ChannelHandlerContext*/void onDisconnected(ChannelHandlerContext ctx);/*** 异常发生* * param ctx ChannelHandlerContext* * param throwable 异常*/void onExceptionCaught(ChannelHandlerContext ctx, Throwable throwable);}监听器实现类 NetworkListener
package com.loveprogrammer.base.network.support;import com.loveprogrammer.base.network.listener.INetworkEventListener;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class NetworkListener implements INetworkEventListener {protected static final Logger logger LoggerFactory.getLogger(NetworkListener.class);Overridepublic void onConnected(ChannelHandlerContext ctx) {logger.info(建立连接);}Overridepublic void onDisconnected(ChannelHandlerContext ctx) {logger.info(建立断开);}Overridepublic void onExceptionCaught(ChannelHandlerContext ctx, Throwable throwable) {logger.warn(异常发生, throwable);}
}然后我们要修改TcpServerStringInitializer
public class TcpServerStringInitializer extends ChannelInitializerSocketChannel {Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline pipeline ch.pipeline();pipeline.addLast(framer,new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));pipeline.addLast(decoder, new StringDecoder());pipeline.addLast(encoder, new StringEncoder());INetworkEventListener listener new NetworkListener();pipeline.addLast(new TcpMessageStringHandler(listener));}}
TcpMessageStringHandler.java 修改如下
package com.loveprogrammer.base.network.channel.tcp.str;import com.loveprogrammer.base.network.listener.INetworkEventListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** ClassName TcpMessageStringHandler* Description tcp消息处理类* Author admin* Date 2024/2/4 15:16* Version 1.0*/
public class TcpMessageStringHandler extends SimpleChannelInboundHandlerString {private static final Logger logger LoggerFactory.getLogger(TcpMessageStringHandler.class);private final INetworkEventListener listener;public TcpMessageStringHandler(INetworkEventListener listener) {this.listener listener;}Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable throwable) {listener.onExceptionCaught(ctx,throwable);}Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {super.channelRead(ctx, msg);}Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {logger.info(数据内容data msg);String result 我是服务器我收到了你的信息: msg;result \r\n;ctx.writeAndFlush(result);}Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {listener.onConnected(ctx);}Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {listener.onDisconnected(ctx);}
}上一章
从零开始手写mmo游戏从框架到爆炸二— 核心组件抽离与工厂模式创建-CSDN博客
下一章
从零开始手写mmo游戏从框架到爆炸四— session session-CSDN博客 全部源码详见
gitee : eternity-online: 多人在线mmo游戏 - Gitee.com
分支step-03 参考
java游戏服务器开发 https://blog.csdn.net/cmqwan/category_7690685.html