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

游戏开发课程济南seo公司

游戏开发课程,济南seo公司,设计官网收费标准,做网站工作都包括什么1、先构建基本的netty框架 再下面的代码中我构建了一个最基本的netty实现websocket的框架,其他个性化部分再自行添加。 Slf4j public class TeacherServer {public void teacherStart(int port) throws InterruptedException {NioEventLoopGroup boss new NioEve…

1、先构建基本的netty框架

再下面的代码中我构建了一个最基本的netty实现websocket的框架,其他个性化部分再自行添加。

@Slf4j
public class TeacherServer {public void teacherStart(int port) throws InterruptedException {NioEventLoopGroup boss = new NioEventLoopGroup();NioEventLoopGroup worker = new NioEventLoopGroup(2);try{ServerBootstrap serverBootstrap = new ServerBootstrap().group(boss, worker).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<NioSocketChannel>() {@Overrideprotected void initChannel(NioSocketChannel nsc) throws Exception {//http的编解码器nsc.pipeline().addLast(new HttpServerCodec());//将多个快组成一个完整的http请求nsc.pipeline().addLast(new HttpObjectAggregator(65536));nsc.pipeline().addLast(new WebSocketServerProtocolHandler("/teacher", null, true, 65536 * 10,false,true));}});ChannelFuture cf = serverBootstrap.bind(port).sync();log.info("教师服务已开启");cf.channel().closeFuture().sync();} finally {boss.shutdownGracefully().sync(); // 释放线程池资源worker.shutdownGracefully().sync();}}//初始化public void init(int port){//异步启动new Thread(() -> {try {teacherStart(port);} catch (InterruptedException e) {e.printStackTrace();}}).start();}
}

要实现websocket并且实现url传参,我们需要关注WebSocketServerProtocolHandler处理的一个参数:checkStartsWith

这个参数我们需要把他设置成ture,为什么呢,让我们来看一下源码isWebSockerPath(),这方法是判断具体的url是否和我设置的路径相匹配:

可以看出如果checkStartWith设为false的话,则必须url和websocketPath相等,否则会返回false。如果设置为true的话则只需要websocketPath是具体的url的前缀就行。当最后返回false时,连接就无法建立。

我们看源码这是一个处理类WebSocketServerProtocolHandshakeHandler,这是WebSocketServerProtocolHandler这个处理类再创建的时候给加pipelien()里的的,放在其之前,专门用来处理握手的处理器。可以看到如果返回false,则不会接下来进行握手操作,而是直接将消息返回给下一个处理器。如果这样的话我们可以认为连接已经失败。

所以我们如果要通过url传参的话再构建WebSocketServerProtocolHandler对象时要将chaekStartWith设为true。

2、获取url中的传参

        2.1 再没建立连接前获取url

        因为websocket发起建立连接用的时http协议并携带升级协议的请求,后面服务端进行升级,将其升为websocket,那么我们可以再还未升级前,也就是再WebSocketServerProtocolHandler处理器前再新增一个处理器,读取第一次发起的http请求。再其中获取url,等获取到初始化完后将这个处理器从pipelien中移除

FullRequest是一个Java类,它表示一个完整的HTTP请求,包含请求方法、路径、头部和内容。它是Netty框架中的一个组件,用于处理网络通信。

public class TeacherContineHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext channelHandlerContext, Object msg) throws Exception {if (msg instanceof FullHttpRequest){FullHttpRequest request = (FullHttpRequest) msg;String uri = request.uri();/**再这里编写自己的操作*/// 在本channel上移除这个handler消息处理,即只处理一次,鉴权通过与否channelHandlerContext.pipeline().remove(TeacherContineHandler.class);}super.channelRead(channelHandlerContext, msg);}
}

ps:主要放置顺序: 

2.2 建立后通过自定义事件HandshakeComplete获取url 

其实netty已经为我们想好了,我也是看源码才发现的,再连接建立完成后WebSocketServerProtocolHandshakeHandler会响应一个事件,再这个事件里我们可以获取到我们想要的请求路径和请求头,我们通过这个方法不光可以再url上传参,还能通过请求头传参。

 其中我们通过一个 那个futre对象,就是握手方法返回的,该对象是一个异步的操作结果,可以在完成时触发回调函数。当其完成时我们通过这个对象判断是否成功握手。如果握手成功,那么就调用localHandshakePromise的trySuccess方法,表示握手成功,并调用ctx.fireUserEventTriggered方法,触发两个用户自定义的事件,分别是:

  • ServerHandshakeStateEvent.HANDSHAKE_COMPLETE,表示握手完成的状态事件。
  • HandshakeComplete,表示握手完成的具体信息,包括req.uri()、req.headers()和handshaker.selectedSubprotocol(),分别表示WebSocket的URI地址、HttpRequest的头信息和选择的子协议。

那我们就可以通过监听这个用户自定义事件来获取请求体了。具体做法就是我们需要实现userEventTriggered()方法这个方法就是用来再有用户自定义事件发生时被调用的,

具体实现如下:

public class TeacherWebSocketHandler extends ChannelInboundHandlerAdapter {@Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if (evt instanceof WebSocketServerProtocolHandler.HandshakeComplete){WebSocketServerProtocolHandler.HandshakeComplete handshakeComplete = (WebSocketServerProtocolHandler.HandshakeComplete) evt;String s = handshakeComplete.requestUri();HttpHeaders entries = handshakeComplete.requestHeaders();/*** 实现自己的初始化操作*/}super.userEventTriggered(ctx, evt);}
}

3、项目启动

我们的启动代码就写在main方法当中,再这个方法进行初始化,记得传入你想监听的端口,如果你想监听多个端口,可以安这样的步骤之间重复再写一遍就行,因为是异步启动的。

http://www.dinnco.com/news/51489.html

相关文章:

  • 企业网站可以个人备案window优化大师
  • 网页源代码查看器seo包年优化平台
  • 武汉做网站找哪家好北京seo代理公司
  • 临沂建设局网站农民工保证金百度热榜排行
  • 做一个色流网站怎么做广告推广有哪些平台
  • 电商网站图片处理海淀seo搜索引擎优化公司
  • 网站备案幕布怎么申请google 谷歌
  • 深圳网站建设知了网络西安疫情最新数据消息中高风险地区
  • 做网站做手机app要学什么软件优化设计的答案
  • 网站基本建设投资内容建个网站需要多少钱?
  • 贵阳市做网站公司怎样制作一个自己的网站
  • 济南网站的优化自己在家做电商
  • 中小型网站站内搜索实现什么优化
  • 做货代的可以在哪些网站打广告seo技术学院
  • 珠海制作企业宣传片西安百度seo代理
  • 餐饮网站建设方案网络营销主要做些什么
  • 网站建设公司推制作app平台需要多少钱
  • 武汉企业网站推广报价seo关键字怎么优化
  • 怎么添加网站关键词重庆seo排名技术
  • 哈尔滨哪里有做网站的seo实战培训中心
  • 光明网站建设小小课堂seo自学网
  • 网站服务器和网站淘宝seo搜索引擎优化
  • 自己做网站卖矿山设备软文营销案例文章
  • 网站建设费用预算表、代发广告平台
  • 淮南市建设委员会网站seo外包品牌
  • 分销小程序开发研发公司优化培训课程
  • 家纺营销型网站域名买卖交易平台
  • 西部数码网站管理助手安装优化大师官网登录入口
  • 好看好用的wordpress主题杭州网站seo
  • 开发板有什么用廊坊seo关键词优化