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

连接国外网站做端口映射商场设计理念

连接国外网站做端口映射,商场设计理念,泰安的网站建设公司哪家好,网站设计师的工作环境本文是基于Netty快速上手WebSocket客户端#xff0c;不涉及WebSocket的TLS/SSL加密传输。 WebSocket原理参考【WebSocket简介-CSDN博客】#xff0c;测试用的WebSocket服务端也是用Netty实现的#xff0c;参考【基于Netty实现WebSocket服务端-CSDN博客】 一、基于Netty快速…本文是基于Netty快速上手WebSocket客户端不涉及WebSocket的TLS/SSL加密传输。 WebSocket原理参考【WebSocket简介-CSDN博客】测试用的WebSocket服务端也是用Netty实现的参考【基于Netty实现WebSocket服务端-CSDN博客】 一、基于Netty快速实现WebSocket客户端 import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.ChannelPipeline; import io.netty.channel.EventLoopGroup; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.http.DefaultHttpHeaders; import io.netty.handler.codec.http.HttpClientCodec; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.handler.codec.http.websocketx.WebSocketClientHandshakerFactory; import io.netty.handler.codec.http.websocketx.WebSocketClientProtocolHandler; import io.netty.handler.codec.http.websocketx.WebSocketVersion; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; import io.netty.handler.stream.ChunkedWriteHandler; import lombok.extern.slf4j.Slf4j;import java.net.URI; import java.util.concurrent.CountDownLatch;/*** https://blog.csdn.net/a1053765496/article/details/130701218* 基于Netty快速实现WebSocket客户端不手动处理握手*/ Slf4j public class SimpleWsClient {final CountDownLatch latch new CountDownLatch(1);public static void main(String[] args) throws Exception {SimpleWsClient client new SimpleWsClient();client.test();}public void test() throws Exception {Channel dest dest();latch.await();dest.writeAndFlush(new TextWebSocketFrame(CountDownLatch完成后发送的消息));}public Channel dest() throws Exception {final URI webSocketURL new URI(ws://127.0.0.1:7070/helloWs);EventLoopGroup group new NioEventLoopGroup();Bootstrap boot new Bootstrap();boot.option(ChannelOption.SO_KEEPALIVE, true).option(ChannelOption.TCP_NODELAY, true).group(group).handler(new LoggingHandler(LogLevel.INFO)).channel(NioSocketChannel.class).handler(new ChannelInitializerSocketChannel() {Overrideprotected void initChannel(SocketChannel sc) throws Exception {ChannelPipeline pipeline sc.pipeline();pipeline.addLast(new HttpClientCodec());pipeline.addLast(new ChunkedWriteHandler());pipeline.addLast(new HttpObjectAggregator(64 * 1024));pipeline.addLast(new WebSocketClientProtocolHandler(WebSocketClientHandshakerFactory.newHandshaker(webSocketURL, WebSocketVersion.V13, null, false, new DefaultHttpHeaders())));pipeline.addLast(new SimpleChannelInboundHandlerTextWebSocketFrame() {Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg)throws Exception {System.err.println( 客户端收到消息 msg.text());}Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if (WebSocketClientProtocolHandler.ClientHandshakeStateEvent.HANDSHAKE_COMPLETE.equals(evt)) {log.info(ctx.channel().id().asShortText() 握手完成);latch.countDown();send(ctx.channel());}super.userEventTriggered(ctx, evt);}});}});ChannelFuture cf boot.connect(webSocketURL.getHost(), webSocketURL.getPort()).sync();return cf.channel();}public static void send(Channel channel) {final String textMsg 握手完成后直接发送的消息;if (channel ! null channel.isActive()) {TextWebSocketFrame frame new TextWebSocketFrame(textMsg);channel.writeAndFlush(frame).addListener((ChannelFutureListener) channelFuture - {if (channelFuture.isDone() channelFuture.isSuccess()) {log.info( 发送成功.);} else {channelFuture.channel().close();log.info( 发送失败. cause channelFuture.cause());channelFuture.cause().printStackTrace();}});} else {log.error(消息发送失败 textMsg textMsg);}}} 这里我们不手动进行握手由Netty通过WebSocketClientProtocolHandler进行握手但是我们要知道何时握手完成了。握手完成了我们才能进行正常的消息读写。 握手事件是在自定义的Handler中实现的这里为了方便使用CountDownLatch使用了匿名内部类SimpleChannelInboundHandler的方式。userEventTriggered这个方法会接收到所有的事件其中就包括握手完成事件。 二、基于Netty手动处理WebSocket握手信息 客户端启动代码 import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; 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.NioSocketChannel; import io.netty.handler.codec.http.DefaultHttpHeaders; import io.netty.handler.codec.http.HttpClientCodec; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame; import io.netty.handler.codec.http.websocketx.PingWebSocketFrame; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.handler.codec.http.websocketx.WebSocketClientHandshakerFactory; import io.netty.handler.codec.http.websocketx.WebSocketFrame; import io.netty.handler.codec.http.websocketx.WebSocketVersion;import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URI;/*** https://gitcode.com/ddean2009/learn-netty4/tree/master/src/main/java/com/flydean25/socketclient* https://www.flydean.com/25-netty-websocket-client* https://blog.csdn.net/superfjj/article/details/120648434* https://blog.csdn.net/twypx/article/details/84543518*/ public final class NettyWsClient {static final String URL System.getProperty(url, ws://127.0.0.1:7070/helloWs);public static void main(String[] args) throws Exception {URI uri new URI(URL);final int port uri.getPort();EventLoopGroup group new NioEventLoopGroup();try {WebSocketClientHandler handler new WebSocketClientHandler(WebSocketClientHandshakerFactory.newHandshaker(uri, WebSocketVersion.V13, null, true, new DefaultHttpHeaders()));Bootstrap b new Bootstrap();b.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializerSocketChannel() {Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline p ch.pipeline();p.addLast(new HttpClientCodec(), new HttpObjectAggregator(8192), handler);}});Channel ch b.connect(uri.getHost(), port).sync().channel();handler.handshakeFuture().sync();BufferedReader console new BufferedReader(new InputStreamReader(System.in));while (true) {String msg console.readLine();if (msg null) {break;} else if (再见.equalsIgnoreCase(msg)) {ch.writeAndFlush(new CloseWebSocketFrame());ch.closeFuture().sync();break;} else if (ping.equalsIgnoreCase(msg)) {WebSocketFrame frame new PingWebSocketFrame(Unpooled.wrappedBuffer(new byte[] {8, 1, 8, 1}));ch.writeAndFlush(frame);} else {WebSocketFrame frame new TextWebSocketFrame(msg);ch.writeAndFlush(frame);}}} finally {group.shutdownGracefully();}} } 客户端Handler import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.FullHttpResponse; import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame; import io.netty.handler.codec.http.websocketx.PongWebSocketFrame; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker; import io.netty.handler.codec.http.websocketx.WebSocketFrame; import io.netty.handler.codec.http.websocketx.WebSocketHandshakeException; import io.netty.util.CharsetUtil; import lombok.extern.slf4j.Slf4j;Slf4j public class WebSocketClientHandler extends SimpleChannelInboundHandlerObject {private final WebSocketClientHandshaker handshaker;private ChannelPromise handshakeFuture;public WebSocketClientHandler(WebSocketClientHandshaker handshaker) {this.handshaker handshaker;}public ChannelFuture handshakeFuture() {return handshakeFuture;}Overridepublic void handlerAdded(ChannelHandlerContext ctx) {handshakeFuture ctx.newPromise();}Overridepublic void channelActive(ChannelHandlerContext ctx) {log.info(channelActive, 进行handshake);handshaker.handshake(ctx.channel());}Overridepublic void channelInactive(ChannelHandlerContext ctx) {log.info(channelInactive!);}Overridepublic void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {Channel ch ctx.channel();if (!handshaker.isHandshakeComplete()) {try {handshaker.finishHandshake(ch, (FullHttpResponse) msg);log.info(websocket Handshake 完成!);handshakeFuture.setSuccess();} catch (WebSocketHandshakeException e) {log.info(websocket连接失败!);handshakeFuture.setFailure(e);}return;}if (msg instanceof FullHttpResponse) {FullHttpResponse response (FullHttpResponse) msg;throw new IllegalStateException(Unexpected FullHttpResponse (getStatus response.status() , content response.content().toString(CharsetUtil.UTF_8) ));}WebSocketFrame frame (WebSocketFrame) msg;if (frame instanceof TextWebSocketFrame) {TextWebSocketFrame textFrame (TextWebSocketFrame) frame;log.info(接收到TXT消息: textFrame.text());} else if (frame instanceof PongWebSocketFrame) {log.info(接收到pong消息);} else if (frame instanceof CloseWebSocketFrame) {log.info(接收到closing消息);ch.close();}}Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {// 异常处理log.error(出现异常, cause);if (!handshakeFuture.isDone()) {handshakeFuture.setFailure(cause);}ctx.close();} } 可以看到我们这里也要手动标记握手完成是在自定义的Handler的channelRead0方法中标记的。 测试的时候我们可以看到当客户端发送ping的时候服务端会自动回pong这个是有Netty实现的服务端自带的心跳机制。 2024-05-25 16:35:10 INFO [WebSocketClientHandler] channelActive, 进行handshake 2024-05-25 16:35:10 INFO [WebSocketClientHandler] websocket Handshake 完成! 123 2024-05-25 16:35:26 INFO [WebSocketClientHandler] 接收到TXT消息: 2024-35-25 04:05:26: 123 ping 2024-05-25 16:35:52 INFO [WebSocketClientHandler] 接收到pong消息
http://www.hkea.cn/news/14423525/

相关文章:

  • 网站建设创业wordpress the7 中文
  • 做门户网站建设多少钱wordpress每页显示数量
  • 免费看电视剧网站2020论文网站开发
  • pdf怎么做电子书下载网站黄骅贴吧
  • 郑州做网站推广地php 网站制作的意义
  • nas服务器可以做网站吗想做外贸做哪些网站好
  • 中文网站外链查询工具定州市住房和城乡建设局 网站
  • 成都微信网站建设报价童程童美官方网
  • 中国建站网wordpress 置顶调用
  • 海南景区网站建设方案网站建设简单个人主页
  • 宿州市埇桥建设规划局网站可以做电影网站的主机
  • 太阳宫网站建设福州网站建设营销q479185700刷屏
  • 企业网站 seo怎么做wordpress可以用html5吗
  • 怎么在赶集网上做招聘网站高校两学一做专题网站
  • 大型网站制作哪家好锡盟建设工程造价管理站网站
  • 阿里云建站可不可以备案西安网站设计公司排名
  • 宜兴网站开发网站策划书市场分析2000字
  • 网站建设的架构wordpress适合环境
  • 做网站的公司还市场吗公众号怎么挣钱
  • 金阊seo网站优化软件dw网页设计官网
  • 网上接网站项目潍坊网站搜索引擎优化
  • 网站分析 案例口碑营销的定义
  • 网站搭建免费软件中装建设虎哥
  • 设计网站免费下载做视频网站新手教学
  • 深圳住房建设局官方网站外贸人才网官网
  • 上海百度seo网站优化免费法律咨询24小时在线
  • 广州发际体育用品有限公司SEO网站布局优化
  • 唐山做网站哪家好百度人工服务24小时电话
  • 百度移动网站排名网站建设考试知识点
  • 专门做ppt的网站网站建设公司 信科网络