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

老域名新网站推广做企业网站需要服务器么

老域名新网站推广,做企业网站需要服务器么,wordpress图片清理插件下载,设计师网站除了构建TCP和UDP服务器和客户端#xff0c;Netty还可以用于构建WebSocket服务器。WebSocket是一种基于TCP协议的双向通信协议#xff0c;可以在Web浏览器和Web服务器之间建立实时通信通道。下面是一个简单的示例#xff0c;演示如何使用Netty构建一个WebSocket服务器。 项目…除了构建TCP和UDP服务器和客户端Netty还可以用于构建WebSocket服务器。WebSocket是一种基于TCP协议的双向通信协议可以在Web浏览器和Web服务器之间建立实时通信通道。下面是一个简单的示例演示如何使用Netty构建一个WebSocket服务器。 项目目录 引入pom依赖 dependencygroupIdio.netty/groupIdartifactIdnetty-all/artifactIdversion4.1.69.Final/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency编写SocketServer package com.lzq.websocket.config;import com.lzq.websocket.handlers.WebSocketHandler; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpServerCodec; import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; import io.netty.handler.timeout.ReadTimeoutHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Configuration;import java.util.concurrent.TimeUnit;Slf4j Configuration public class WebSocketConfig implements CommandLineRunner {private static final Integer PORT 8888;Overridepublic void run(String... args) throws Exception {new WebSocketConfig().start();}public void start() {// 创建EventLoopGroupEventLoopGroup bossGroup new NioEventLoopGroup();EventLoopGroup workerGroup new NioEventLoopGroup(Runtime.getRuntime().availableProcessors() * 2);try {ServerBootstrap serverBootstrap new ServerBootstrap();serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializerSocketChannel() {Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {ChannelPipeline pipeline socketChannel.pipeline();pipeline.addLast(new HttpServerCodec());// 最大数据长度pipeline.addLast(new HttpObjectAggregator(65536));// 添加接收websocket请求的url匹配路径pipeline.addLast(new WebSocketServerProtocolHandler(/websocket));// 10秒内收不到消息强制断开连接// pipeline.addLast(new ReadTimeoutHandler(10, TimeUnit.SECONDS));pipeline.addLast(new WebSocketHandler());}});ChannelFuture future serverBootstrap.bind(PORT).sync();log.info(websocket server started, port{}, PORT);// 处理 channel 的关闭sync 方法作用是同步等待 channel 关闭// 阻塞future.channel().closeFuture().sync();} catch (Exception e) {log.error(websocket server exception, e);throw new RuntimeException(e);} finally {log.info(websocket server close);// 关闭EventLoopGroupbossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}} }编写WebSocketHandler package com.lzq.websocket.handlers;import com.lzq.websocket.config.NettyConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.HttpVersion; import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame; import io.netty.handler.codec.http.websocketx.PingWebSocketFrame; import io.netty.handler.codec.http.websocketx.PongWebSocketFrame; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.handler.codec.http.websocketx.WebSocketFrame; import io.netty.handler.codec.http.websocketx.WebSocketServerHandshaker; import io.netty.handler.codec.http.websocketx.WebSocketServerHandshakerFactory; import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; import lombok.extern.slf4j.Slf4j;import java.nio.charset.StandardCharsets;Slf4j public class WebSocketHandler extends SimpleChannelInboundHandlerObject {private WebSocketServerHandshaker webSocketServerHandshaker;private static final String WEB_SOCKET_URL ws://127.0.0.1:8888/websocket;Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {// 创建连接时执行NettyConfig.group.add(ctx.channel());log.info(client channel active, id{}, ctx.channel().id().toString());}Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {// 关闭连接时执行NettyConfig.group.remove(ctx.channel());log.info(client channel disconnected, id{}, ctx.channel().id().toString());}Overridepublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception {// 服务端接收客户端发送过来的数据结束之后调用ctx.flush();}Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if (evt instanceof WebSocketServerProtocolHandler.HandshakeComplete) {WebSocketServerProtocolHandler.HandshakeComplete handshake (WebSocketServerProtocolHandler.HandshakeComplete) evt;log.info(client channel connected, id{}, url{}, ctx.channel().id().toString(), handshake.requestUri());}}Overrideprotected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {if (msg instanceof FullHttpRequest) {// 处理客户端http握手请求handlerHttpRequest(ctx, (FullHttpRequest) msg);} else if (msg instanceof WebSocketFrame) {// 处理websocket连接业务handlerWebSocketFrame(ctx, (WebSocketFrame) msg);}}/*** 处理websocket连接业务** param ctx* param frame*/private void handlerWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {log.info(handlerWebSocketFrameclass{}, frame.getClass().getName());// 判断是否是关闭websocket的指令if (frame instanceof CloseWebSocketFrame) {webSocketServerHandshaker.close(ctx.channel(), ((CloseWebSocketFrame) frame).retain());return;}// 判断是否是ping消息if (frame instanceof PingWebSocketFrame) {ctx.channel().write(new PongWebSocketFrame(frame.content().retain()));return;}if (!(frame instanceof TextWebSocketFrame)) {throw new RuntimeException(不支持消息类型 frame.getClass().getName());}String text ((TextWebSocketFrame) frame).text();if (ping.equals(text)) {ctx.channel().write(new PongWebSocketFrame(frame.content().retain()));return;}log.info(WebSocket message received: {}, text);/*** 可通过客户传输的text设计处理策略* 如text{type: messageHandler, userId: 111}* 服务端根据type采用策略模式自行派发处理** 注意这里不需要使用线程池因为Netty 采用 Reactor线程模型目前使用的是主从Reactor模型* Handler已经是线程处理每个用户的请求是线程隔离的*/// 返回WebSocket响应ctx.writeAndFlush(new TextWebSocketFrame(server return: text));/*// 群发TextWebSocketFrame twsf new TextWebSocketFrame(new Date().toString() ctx.channel().id() : text);NettyConfig.group.writeAndFlush(twsf);*/}/*** 处理客户端http握手请求** param ctx* param request*/private void handlerHttpRequest(ChannelHandlerContext ctx, FullHttpRequest request) {log.info(handlerHttpRequestclass{}, request.getClass().getName());// 判断是否采用WebSocket协议if (!request.getDecoderResult().isSuccess() || !(websocket.equals(request.headers().get(Upgrade)))) {sendHttpResponse(ctx, request, new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.BAD_REQUEST));return;}WebSocketServerHandshakerFactory wsFactory new WebSocketServerHandshakerFactory(WEB_SOCKET_URL, null, false);webSocketServerHandshaker wsFactory.newHandshaker(request);if (webSocketServerHandshaker null) {WebSocketServerHandshakerFactory.sendUnsupportedVersionResponse(ctx.channel());} else {webSocketServerHandshaker.handshake(ctx.channel(), request);}}private void sendHttpResponse(ChannelHandlerContext ctx, FullHttpRequest request, DefaultFullHttpResponse response) {if (response.getStatus().code() ! 200) {ByteBuf buf Unpooled.copiedBuffer(response.getStatus().toString(), StandardCharsets.UTF_8);response.content().writeBytes(buf);buf.release();}// 服务端向客户端发送数据ChannelFuture f ctx.channel().writeAndFlush(response);if (response.getStatus().code() ! 200) {f.addListener(ChannelFutureListener.CLOSE);}}Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {// 非正常断开时调用log.error(client channel execute exception, id{}, ctx.channel().id().toString(), cause);ctx.close();} }NettyConfig package com.lzq.websocket.config;import io.netty.channel.group.ChannelGroup; import io.netty.channel.group.DefaultChannelGroup; import io.netty.util.concurrent.GlobalEventExecutor;public class NettyConfig {/*** 存储接入的客户端的channel对象*/public static ChannelGroup group new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); } 使用Apifox测试
http://www.pierceye.com/news/976136/

相关文章:

  • 网站成品超市学室内设计去哪好
  • 网站备案一个主体无锡建设银行网站
  • delphi xe10网站开发台州做网站多少钱
  • 怎样设计卖奖的网站做电影网站哪个服务器好
  • 找外包公司做网站的好处和坏处wordpress 访问量大
  • 淄博 网站设计越秀公司网站建设
  • 网站该如何做本地网站搭建软件
  • 如何做汽车团购网站学做馒头面包哪个网站好
  • 中国科技成就总结莱芜网站优化排名公司
  • 中国建设银行网站企业网银收费北京网站建设小程序开发
  • 成交型网站倡导公司网络营销课程总结1000字
  • 网站建设注册前端开发培训机构推荐
  • 遵义网站推广中国房地产app下载安装最新版
  • c语言网站建设禅城网站开发
  • 宁波品牌网站制作哪家好太平阳电脑网网站模板
  • seo网站外链工具看设计比较好的网站
  • 济南道驰网站建设有限公司怎么样某网站网站的设计与实现
  • 服装印花图案设计网站设计一个网站要多久
  • ai怎么做自己的网站getpage wordpress使用详解
  • 龙岩做网站推广龙岗网站 建设深圳信科
  • 沈阳网站建设 网络服务广告公司首页
  • 旅游网站建设导航栏中国哪里正在大开发大建设
  • 哪能建设网站建设网站需要哪些流程图
  • 网站YYQQ建设o2o型网站
  • 给客户做网站 赚钱吗赣州省住房和城乡建设厅网站
  • 营销优化型网站怎么做手机app网页制作
  • 上海网站建设服wordpress友情链接排序
  • 沈阳市和平区网站建设编程课适合多大孩子学
  • 东阳网站优化懒人图库
  • 马关县网站建设专注营销型网站建设