当前位置: 首页 > news >正文

一般网站建设用什么语言站长工具查询入口

一般网站建设用什么语言,站长工具查询入口,临淄做网站,举报个人备案网站做经营性目录引言技术选型正文创建基础架构IDEA创建项目添加Netty监听端口编写客户端进行测试总结引言 由于现在java web太卷了,所以各位同行可以考虑换一个赛道,做游戏还是很开心的。 本篇教程给新人用于学习游戏服务器的基本知识,给新人们一些学习…

目录

    • 引言
    • 技术选型
    • 正文
      • 创建基础架构
        • IDEA创建项目
        • 添加Netty监听端口
        • 编写客户端进行测试
    • 总结

引言

由于现在java web太卷了,所以各位同行可以考虑换一个赛道,做游戏还是很开心的。

本篇教程给新人用于学习游戏服务器的基本知识,给新人们一些学习方向,有什么错误的地方欢迎各位同行进行讨论。

技术选型

本篇教程预计使用Java+Redis+Mongo

正文

本着先完成再完美的原则,从最简单的echo服务器开始。

在这里插入图片描述

Echo服务器就是,客户端发什么数据,服务端就原样返回回去。

创建基础架构

IDEA创建项目

在这里插入图片描述

我这边用Gradle进行依赖管理,使用的版本为 gradle8.0.2, openjdk19.

修改build.gradle导入几个基础开发包。

dependencies {//网络implementation group: 'io.netty', name: 'netty-all', version: '4.1.90.Final'//springimplementation group: 'org.springframework', name: 'spring-context', version: '6.0.6'//logimplementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.36'implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.2.11'implementation group: 'ch.qos.logback', name: 'logback-access', version: '1.2.11'implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.11'//lombokcompileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.24'
}

创建Bean配置类

@Configuration
@ComponentScan(basePackages = {"com.wfgame"})
public class GameBeanConfiguration {
}

创建主类

@Component
@Slf4j
public class GameMain {public static void main(String[] args) {// 初始化SpringAnnotationConfigApplicationContext springContext = new AnnotationConfigApplicationContext(GameBeanConfiguration.class);springContext.start();log.info("server start!");}
}

运行一下,正常输出server start!

我们会发现,程序执行后马上停止了,对于游戏服务器来说,我们需要保持运行状态,等待玩家接入进行游戏。所以我们main中增加一个循环,不停读取控制台输入,当读取到控制台输入stop时,我们再进行停服。

修改main方法如下:

    public static void main(String[] args) {// 初始化SpringAnnotationConfigApplicationContext springContext = new AnnotationConfigApplicationContext(GameBeanConfiguration.class);springContext.start();log.info("server start!");//region 处理控制台输入,每秒检查一遍 stopFlag,为true就跳出循环,执行关闭操作BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 设置循环使服务器不立刻停止while (true) {if (stopFlag) {log.info("receive stop flag, server will stop!");break;}// 每次循环停止一秒,避免循环频率过高try {Thread.sleep(1000L);} catch (InterruptedException e) {e.printStackTrace();}//处理控制台指令try {if (br.ready()) {String cmd = br.readLine().trim();if (cmd.equals("stop")) {//正常关服stopFlag = true;log.info("Receive stop flag, time to stop.");} else {log.info("Unsupported cmd:{}", cmd);}}} catch (Exception e) {e.printStackTrace();}}//停掉虚拟机System.exit(0);}

这样我们就获得了一个可以控制停服的服务器。当我们控制台输入stop时,程序结束运行。

添加Netty监听端口

要与客户端进行TCP连接,需要建立socket通道,然后通过socket通道进行数据交互。

传统BIO一个线程一个连接,有新的连接进来时就要创建一个线程,并持续读取数据流,当这个连接发送任何请求时,会对性能造成严重浪费。

NIO一个线程通过多路复用器可以监听多个连接,通过轮询判断连接是否有数据请求。

Netty对java原生NIO进行了封装,简化了代码,便于我们的使用。

Netty的包我们之前已经导入过了,直接拿来用即可。

首先我们创建一个Netty自定义消息处理类。

@Sharable
public class NettyMessageHandler extends SimpleChannelInboundHandler<Object> {/*** 读取数据*/@Overrideprotected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {this.doRead(ctx, msg);}private void doRead(ChannelHandlerContext ctx, Object msg) {System.out.println("received msg = : " + msg);// 马上将原数据返回ctx.writeAndFlush(msg);}
}

然后编写Netty服务器启动代码,我们修改GameMain类的代码

@Component
@Slf4j
public class GameMain {// 停服标志private static boolean stopFlag = false;public static void main(String[] args) {// 初始化SpringAnnotationConfigApplicationContext springContext = new AnnotationConfigApplicationContext(GameBeanConfiguration.class);springContext.start();// 启动Netty服务器try {startNetty();log.info("Netty server start!");} catch (InterruptedException e) {e.printStackTrace();}log.info("server start!");//region 处理控制台输入,每秒检查一遍 stopFlag,为true就跳出循环,执行关闭操作BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 设置循环使服务器不立刻停止while (true) {if (stopFlag) {log.info("receive stop flag, server will stop!");break;}// 每次循环停止一秒,避免循环频率过高try {Thread.sleep(1000L);} catch (InterruptedException e) {e.printStackTrace();}//处理控制台指令try {if (br.ready()) {String cmd = br.readLine().trim();if (cmd.equals("stop")) {//正常关服stopFlag = true;log.info("Receive stop flag, time to stop.");} else {log.info("Unsupported cmd:{}", cmd);}}} catch (Exception e) {e.printStackTrace();}}//停掉虚拟机System.exit(0);}/*** 启动netty服务器*/private static void startNetty() throws InterruptedException {int port = 2333;log.info("Netty4SocketServer start---Normal, port = " + port);final NioEventLoopGroup bossGroup = new NioEventLoopGroup(2);final NioEventLoopGroup workerGroup = new NioEventLoopGroup();ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup);bootstrap.channel(NioServerSocketChannel.class);bootstrap.option(ChannelOption.SO_REUSEADDR, true);//允许重用端口bootstrap.option(ChannelOption.SO_BACKLOG, 512);//允许多少个新请求进入等待bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);//是否使用内存池bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);    // 保持连接活动bootstrap.childOption(ChannelOption.TCP_NODELAY, false);    // 禁止Nagle算法等待更多数据合并发送,提高信息及时性bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);//是否使用内存池final NettyMessageHandler handler = new NettyMessageHandler();bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline cp = ch.pipeline();cp.addLast(new StringDecoder());cp.addLast(new StringEncoder());cp.addLast("handler", handler);}});// 绑定并监听端口bootstrap.bind(port).sync();//线程同步阻塞等待服务器绑定到指定端口// 优雅停机Runtime.getRuntime().addShutdownHook(new Thread(() -> {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}));log.info("Netty4SocketServer ok,bind at :" + port);}

我们先创建了一个startNetty()方法,用于启动Netty服务器,同时绑定了端口2333

我们要注意一下initChannel这块代码,我们注册了String编码解码器,他们是用换行符作为一个消息的结束标志,因此我们等下通过客户端发送消息过来需要在行尾添加换行符。同时将我们自定义的消息处理类也注册进pipeline中,当客户端发送消息过来,先通过StringDecoder进行解码,然后流入自定义处理类中进行下一步处理。

至此服务端Netty接入完毕,我们下面编写一个客户端进行测试。

编写客户端进行测试

我们增加了ClientMain类,用socket与服务器进行连接,读取控制台输入上行到服务器,同时接受服务器下行的消息。

public class ClientMain {private static Socket socket = null;private static BufferedReader br = null;private static BufferedWriter writer = null;private static BufferedReader receivedBufferedReader = null;public static void main(String[] args) {// 新增连接到服务器startSocket();}/*** 启动socket连接*/private static void startSocket() {try {socket = new Socket("127.0.0.1", 2333);br = new BufferedReader(new InputStreamReader(System.in));writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));receivedBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));new Thread(() -> {try {while (true) {Thread.sleep(1000L);String s = receivedBufferedReader.readLine();if (s!=null && !s.equals("")) {System.out.println("receive: " + s);}}} catch (IOException | InterruptedException e) {e.printStackTrace();}}).start();while (true) {Thread.sleep(1000L);if (br.ready()) {writer.write(br.readLine().trim() + "\n");writer.flush();}}} catch (IOException | InterruptedException e) {e.printStackTrace();} finally {try {if (receivedBufferedReader != null) {receivedBufferedReader.close();}if (writer != null) {writer.close();}if (br != null) {br.close();}if (socket != null) {socket.close();}} catch (Exception e) {e.printStackTrace();}}}
}

测试一下,我们先运行服务器,再运行客户端。

在客户端控制台下输入测试信息。

在这里插入图片描述

可以成功进行信息交互

总结

本节一共做了这么几件事:

  1. 项目的初步创建,通过build.gradle进行依赖包的管理。
  2. Netty服务器的启动,并且不断监听控制台输入,客户端上行数据的读取。
  3. 编写测试用客户端,与服务器进行数据交互。

下一节将进行注册登录的开发,内容将会比较多,感兴趣的点点关注或者留言评论。


文章转载自:
http://adaptive.c7495.cn
http://gynecium.c7495.cn
http://expletive.c7495.cn
http://haarlem.c7495.cn
http://parhelion.c7495.cn
http://penalty.c7495.cn
http://criosphinx.c7495.cn
http://mux.c7495.cn
http://niffy.c7495.cn
http://shiraz.c7495.cn
http://accompanist.c7495.cn
http://twankay.c7495.cn
http://adaptation.c7495.cn
http://plausibly.c7495.cn
http://reafforest.c7495.cn
http://bks.c7495.cn
http://ergastic.c7495.cn
http://inexpedience.c7495.cn
http://cochromatograph.c7495.cn
http://cardoon.c7495.cn
http://humanics.c7495.cn
http://inkwriter.c7495.cn
http://lubricity.c7495.cn
http://oceanology.c7495.cn
http://kenspeckle.c7495.cn
http://weedy.c7495.cn
http://brushland.c7495.cn
http://ruskinize.c7495.cn
http://planetabler.c7495.cn
http://scimitar.c7495.cn
http://thermoperiodicity.c7495.cn
http://glabrate.c7495.cn
http://gigantism.c7495.cn
http://behind.c7495.cn
http://infinite.c7495.cn
http://ac.c7495.cn
http://sentence.c7495.cn
http://pornocracy.c7495.cn
http://pseudocarp.c7495.cn
http://vinylite.c7495.cn
http://atmospherics.c7495.cn
http://impulsion.c7495.cn
http://spencerian.c7495.cn
http://equiprobability.c7495.cn
http://bandolero.c7495.cn
http://implausibly.c7495.cn
http://slipstone.c7495.cn
http://prandial.c7495.cn
http://removable.c7495.cn
http://kodak.c7495.cn
http://cookshack.c7495.cn
http://elsewhere.c7495.cn
http://obduracy.c7495.cn
http://velvet.c7495.cn
http://embryotomy.c7495.cn
http://chambray.c7495.cn
http://uneloquent.c7495.cn
http://montanic.c7495.cn
http://algous.c7495.cn
http://abundant.c7495.cn
http://unseasonable.c7495.cn
http://emphasize.c7495.cn
http://anabiosis.c7495.cn
http://concuss.c7495.cn
http://malodour.c7495.cn
http://chlorometer.c7495.cn
http://mouch.c7495.cn
http://maximate.c7495.cn
http://phycoerythrin.c7495.cn
http://learnable.c7495.cn
http://handgrip.c7495.cn
http://aoudad.c7495.cn
http://inexpressive.c7495.cn
http://foliar.c7495.cn
http://uncinal.c7495.cn
http://undelete.c7495.cn
http://oceanics.c7495.cn
http://foraminate.c7495.cn
http://vomer.c7495.cn
http://what.c7495.cn
http://sericterium.c7495.cn
http://gastrologer.c7495.cn
http://quadrisyllable.c7495.cn
http://ampulla.c7495.cn
http://legitimize.c7495.cn
http://electrohemostasis.c7495.cn
http://retrocede.c7495.cn
http://overbearing.c7495.cn
http://putridity.c7495.cn
http://hierarchize.c7495.cn
http://hashing.c7495.cn
http://gila.c7495.cn
http://shape.c7495.cn
http://junker.c7495.cn
http://fordize.c7495.cn
http://stewed.c7495.cn
http://infuser.c7495.cn
http://ashlar.c7495.cn
http://antisepticise.c7495.cn
http://kotwal.c7495.cn
http://www.zhongyajixie.com/news/86424.html

相关文章:

  • 泰州做兼职的网站网站设计与网页制作
  • 有什么做任务得佣金的网站app推广员怎么做
  • 在线音乐播放网站模板百度广告怎么收费
  • 做logo有哪些网站长安网站优化公司
  • 做赌钱网站seo的概念
  • html5网站用什么软件企业网站优化公司
  • 网站建设总结报告2024年重启核酸
  • 广州市网站建设科技公司百度官网入口
  • 征二级网站建设意见 通知qq营销推广方法和手段
  • 田贝网站建设上海网站制作公司
  • wap手机网站程序搜索引擎优化技术有哪些
  • 上海市网站建设网络营销产品的特点
  • 泸州北京网站建设爱廷玖达泊西汀
  • 建站宝盒站群版安卓优化大师app下载安装
  • 建设一个外贸网站需要多少钱色盲
  • 网站建设价格标准渠道谷歌浏览器最新版本
  • 如何在网站做qq群链接如何把一个关键词优化到首页
  • 网站建设使用哪种语言好深圳百度搜索排名优化
  • 怎样免费建设个人网站百度推广有哪些售后服务
  • 网站建设ftp上传是空目录百度秒收录
  • 做网站 发现对方传销怎么制作公司网页
  • 郑州网站建设网站推广今天上海最新新闻事件
  • 包头网站建设公司seo流量
  • 平台和网站有什么区别福州百度快速优化
  • 如何建立国外网站seo效果检测步骤
  • 做网站网站建设专业公司哪家好模板建站多少钱
  • 蛋糕电子商务网站建设方案厦门百度推广排名优化
  • 优秀网站建设排名公司中国国家培训网
  • 编写网站程序深圳外贸网站制作
  • 深圳建网站多少钱网站收录查询入口