netty socket_Netty:另一种Web(Socket)服务器

netty socket

如今, Netty已用于Internet上的各种应用程序中,以处理数千个(如果不是上百万个)聊天对话,包括Minecraft , Twitter和许多其他应用程序在内的多人游戏。 但是,它并没有深入到开发企业应用程序的企业程序员的头脑中。

我相信Netty可以引入其他功能解决方案无法比拟的新功能,因为它具有完全双向文本和二进制非HTTP数据传输功能,并且比传统的“每线程线程数”支持更多的并发客户端”服务器。

您可能知道Netty在WebSockets方面的能力,但是您知道它可以像传统的Web服务器一样出色地工作吗? 由于其非常周到的设计,通过在其管道中添加适当的处理程序,Netty几乎可以处理任何流量。 它还可以同时处理多种类型,例如同时通过同一端口处理WebSocket和HTTP。 通过将这些结合在一起,程序员可以避免处理诸如CORS(跨源资源共享)之类的麻烦问题,当浏览器尝试向未从其下载的服务器发出请求时,这些麻烦可能会抬起头来。

净值的力量

为了显示其转换企业应用程序的功能,我整理了一个代码示例,显示了Web的传统示例之一,该示例正在检索股价。

其他应用程序必须发出AJAX请求,轮询,具有刷新按钮等才能更新价格。 WebSockets消除了任何这些需求。 创建持续开放的双向连接后,客户端和服务器都可以在需要时彼此对话,而无需任何协商。 因此,客户端让服务器知道任何用户何时更改标准,并且只要相关数据基于该标准发生变化,服务器就会更新客户端。

  • 您可以在此处找到功能齐全的代码。

我为客户端设置了一些基于JSON的协议,以使服务器知道用户的决定。 要将新符号添加到服务器正在监视客户端的列表中,只需要一个简单的调用即可。 这是一个例子:

doSend('{"command":"add", "tickerSymbol":"GOOG"}');

这会将符号添加到列表中。 服务器的下一次更新将在其数据中包括新符号的当前股价(来自Yahoo Finance的REST API)。 删除项目同样容易:

doSend('{"command":"remove", "tickerSymbol":"GOOG"}');

使用这两个命令,客户端可以控制服务器正在为每个用户监视的符号列表。 在Netty处理程序的服务器端,程序员要考虑多个用户的唯一工作是确保为每个新连接创建一个新的处理程序,并且在不共享数据的地方不使用静态成员。 。 除非另有说明,否则Netty假定处理程序不可共享。

让我们看看如何为Netty管道定义处理程序。 这来自StockTickerServer类:

ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast("encoder", new HttpResponseEncoder());
p.addLast("decoder", new HttpRequestDecoder());
p.addLast("aggregator", new HttpObjectAggregator(65536));
p.addLast("handler", new StockTickerServerHandler());
}
});

这里的顺序非常重要,因为管道中的每个处理程序都有机会处理(或不处理)数据并将其传递给下一个处理程序。 库存行情处理程序位于底部,因为它是将数据发送回客户端的程序,因此位于管道的末端。 通过创建处理程序的新实例,每个新连接都将获得每个处理程序自己的实例。 如果处理程序是无状态的并且是线程安全的,则可以在适用的情况下使用单例代替以节省内存。 我使用的处理程序中没有一个是可共享的,因此这里没有显示示例。

Netty作为Web服务器

使用一些技巧来使Netty同时处理HTTP和WebSocket通信。

1. StockTickerServerHandler扩展了SimpleChannelInboundHandler <Object>

这告诉Netty,我们希望所有流量都到达此处理程序。 否则,如果只想处理HTTP通信,则可以使用SimpleChannelInboundHandler <FullHttpRequest>;如果只想处理WebSocket通信,则可以使用SimpleChannelInboundHandler <WebSocketFrame>。

2. channelRead0(通道读取为零)方法

@Override
protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof FullHttpRequest) {
this.handleHttpRequest(ctx, (FullHttpRequest)msg);
} else if (msg instanceof WebSocketFrame) {
this.handleWebSocketFrame(ctx, (WebSocketFrame)msg);
}
}

这使我们能够根据每种协议处理HTTP和WebSocket通信。 handleHttpRequest提供HTML,图像,CSS,JavaScript和所有其他正常的网络流量,handleWebSocketFrame指出如何处理从客户端发送的自定义消息。

3.哑剧类型

Netty没有内置处理Mime类型的支持,因为WebSocket调用本质上并不需要它们。

我添加了Apache的mime类型文件的稍作修改的版本,并静态加载了它。 我正在负载上进行同步,因为Netty可以在开始时为池创建很多处理程序,并且构造函数可以同时由多个处理程序执行。 由于该字段是静态的,因此在映射变为非null之前,可以对其进行多次加载。 同步静态锁(不是类的当前实例)可以防止这种情况的发生。

其他详情

handleWebSocketFrame方法处理WebSocket协议定义的不同“已知”帧类型。 收到全文框后,我会将其传递给我创建的接口的实现者,以指定如何处理业务逻辑。

该代码存在于StockTickerMessageHandler中。 它创建一个后台线程来检索股票报价并将其发送给客户端,并处理客户端发送的命令。

那里有一些凌乱的代码,用于处理Yahoo发送的Gzip压缩数据并解析服务返回的JSON,以及一些使用java.util.concurrent类的代码(例如Executor,AtomicBoolean,AtomicReference和CopyOnWriteArrayList)来保存后台线程和Netty处理程序彼此踩踏,因为它们共享有关通道和当前符号列表的详细信息。

我还使用Gson将传入的JSON转换为POJO,以便更轻松地对其进行处理。 除此之外,这仅仅是本示例的业务目的。

关于身份验证的注意事项

我没有时间向此示例添加身份验证。 如果这样做的话,我会使用Shiro ,它是一种功能强大的身份验证/授权/密码框架,可与普通应用程序和Web应用程序一起使用。 也缺少HTTPS支持,因为这是检查股票价格的公共应用程序。 有添加HTTPS(和WSS)的例子在这里 。

使用JavaScript WebSockets很难(即使不是不可能)的一件事是发送身份验证数据以及升级请求(即调用新的WebSocket(uri))。 因此,通常首先像正常网站一样发送HTTPS POST并设置auth cookie令牌。 这样,发送升级请求时,cookie会自动发送。 使用身份验证时,请记住使用HTTPS和WSS而不是HTTP和WS来保护数据。 身份验证到位后,就变成了在必要时检查经过身份验证的用户的问题,注意某些流量应始终通过(HTML,图像等)。

  • 代码项目

结论

Netty已成为构建新应用程序的一种高性能,改变游戏规则的方法。 通过利用WebSockets提供的功能,当今的企业应用程序可以比现在更具交互性。 我希望您喜欢这个进入Netty的小冒险,并请原谅糟糕的浏览器客户端,我只是没有时间为此示例制作一个不错的Backbone.js客户端应用程序。

谢谢!

翻译自: https://www.javacodegeeks.com/2015/03/netty-a-different-kind-of-websocket-server.html

netty socket

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机用户guest无法删除吗,Win7怎么删除Guest账户?

原标题&#xff1a;Win7怎么删除Guest账户&#xff1f;我们都知道&#xff0c;访客帐户是系统附带的帐户。通常&#xff0c;用户给出了访客帐户。为了确保系统的安全性&#xff0c;它是一个限制帐户。使用客人帐户&#xff0c;您有权临时使用我们的计算机。但是&#xff0c;一些…

为什么C语言不会过时?

点击上方蓝字关注我&#xff0c;了解更多咨询评价任何一门编程语言&#xff0c;都是招人骂的。永远是这样。就像是春寒料峭的季节&#xff0c; 街上穿棉袄和穿单衣的擦肩而过&#xff0c;双方一定是同时在心里出现了两个字&#xff1a;“傻逼&#xff01;”这个在心理学上有个专…

机械装备计算机控制技术考试题,武汉理工大学机电工程学院研究生课程考试试题(肖峻)...

武汉理工大学机电工程学院研究生课程考试试题课程名称 机械装备计算机控制技术Ⅱ一&#xff0e;简答题(合计30分&#xff0c;每题10分)1、计算机控制系统按系统结构和控制功能分为哪几种&#xff1f;分别描述其特点。2、简述几种常用的数字滤波方法及其优、缺点。如何选用各种数…

java 性能 优化_Java十大简单性能优化

java 性能 优化关于“ web scale ”这个流行词有很多炒作&#xff0c;人们花了很多时间来重新组织他们的应用程序体系结构&#xff0c;以使其系统“规模化”。 但是什么是扩展&#xff0c;我们如何确保可以扩展&#xff1f; 缩放的不同方面 上面提到的炒作主要是关于扩展负载…

cx_oracle写日志信息_看日志痛苦——可能是你方法不对

看日志&#xff0c;是研发的日常工作&#xff0c;相信你已经从各种报错日志中查出许多BUG&#xff0c;但也被冗长、复杂的日志困扰过无数次。在日常工作中&#xff0c;我也经常痛苦于看日志&#xff0c;一般是这些日志长得面目狰狞&#xff1a;日志文件太大&#xff0c;打开都很…

在Swift中使用C语言的指针

点击上方蓝字关注我&#xff0c;了解更多咨询Objective-C和C语言经常需要使用到指针。Swift中的数据类型由于良好的设计&#xff0c;使其可以和基于指针的C语言API无缝混用。同时 Swift也可以自动处理大多数将指针作为参数的情况。在这篇文章里&#xff0c;我们可以看到在Swift…

计算机四级数据库分值分布,计算机四级数据库工程师考试成绩查询注意事项

计算机四级数据库工程师考试成绩查询注意事项为帮助广大考生更好的了解有关计算机四级数据库工程师考试的相关信息&#xff0c;唯学小编特整理了计算机四级数据库工程师考试成绩查询注意事项&#xff0c;望考生能够认真查看。同时唯学小编特别提醒想要参加数据库工程师考试的考…

android 音频合成_【Android工具】用手机测量噪声的工具软件,噪声仪分贝计,量化噪声声音工具...

今天分享一个通过手机麦克风测量环境噪声的工具——声级计(噪声仪)。本来是要分享另一款的&#xff0c;但下载下来的是xapk的安装包&#xff0c;太麻烦了&#xff0c;功能差不多&#xff0c;大家就先用这款吧&#xff0c;有条件的朋友可以去play自己下载。软件名称&#xff1a;…

cassandra_Apache Cassandra和低延迟应用程序

cassandra介绍 多年来&#xff0c; Grid Dynamics拥有许多与NoSQL相关的项目&#xff0c;尤其是Apache Cassandra。 在这篇文章中&#xff0c;我们要讨论一个给我们带来挑战的项目&#xff0c;而我们在该项目中试图回答的问题今天也仍然适用。 数字营销和在线广告在2012年很受…

浅析五种C语言内存分配的方法及区别

点击上方蓝字关注我&#xff0c;了解更多咨询在C语言中&#xff0c;内存分成5个区&#xff0c;他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈&#xff0c;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清楚的变量的存储区。里面的变量通常…

认识计算机听课记录20篇,【中学信息技术听课记录】 信息技术听课记录15篇及评析_初中信息技术听课记录_高中信息技术听课记录20篇_东城教研...

中学信息技术听课记录关于中学信息技术听课记录&#xff0c;东城教研小编了解到&#xff1a;听课记录表(一)实习学校&#xff1a;_xxx九年制学校__ 实践基地任课教师:xxx 班 级 八、一 时 间 2014.12.22 授课人 xxx 授课题目 软件的下载与安装 类 型 新授 教学过程 内 容 说 明…

电脑装机完没有efi_电脑装机如何选内存?看完这篇就全懂了

电脑运行太慢&#xff0c;很多小伙伴第一想到的就是加个内存&#xff0c;没错&#xff0c;一般主板上预留了两个以上的内存插槽&#xff0c;加内存是升级电脑最划算的一个硬件升级&#xff0c;其次&#xff0c;可能是加个固态硬盘来提速。今天电脑学习小编教你如何选择适合自己…

数据库 ogm_带有Hibernate OGM的NoSQL –第二部分:查询数据

数据库 ogmHibernate OGM的第一个最终版本发布于 1月底&#xff0c;团队一直在忙于制作一系列教程式博客&#xff0c;使您有机会轻松地从Hibernate OGM重新开始。 第一部分是关于设置和保留您的第一个实体 。 在第二部分中&#xff0c;您将学习如何查询数据。 Hibernate OGM将使…

计算机网络技术教法改革方案,计算机网络技术专业教学模式改革探索

龙源期刊网 http://doc.wendoc.com计算机网络技术专业教学模式改革探索作者&#xff1a;魏学宏来源&#xff1a;《职业中旬》2014年第12期摘要&#xff1a;中职教育是培养应用型技术人才的教育。为实现培养目标&#xff0c;推动教学方法改革&#xff0c;笔者在计算机网络技术专…

osgi:install_OSGi服务测试助手:ServiceCollector

osgi:installOSGi服务对于基于松散耦合组件的系统开发非常有用。 但是&#xff0c;松散的耦合可能使得难以识别与悬挂服务引用有关的问题。 因此&#xff0c;我们通常运行集成测试以确保运行时服务组件的可用性。 为了减少此类测试所需的样板&#xff0c;我编写了一个简单的实…

塞尔达盾反机器人_微软商店惊现《塞尔达传说:旷野之息》!任天堂暗示《喷射战士3》?| Jump简报...

首先还是祝各位Jumper圣诞快乐&#xff01;业界新闻1. 各大厂商新年寄语&#xff0c;表明未来动向Fami通收到了54家日厂的新年贺卡&#xff0c;其中表明了相当多的新游戏和企划&#xff0c;具体如下&#xff1a;Atlus &#xff1a;《真女神转生V》和《PROJECT Re FANTASY》正在…

PHP 社区拒绝在俄乌冲突中“站队”

点击上方蓝字关注我&#xff0c;了解更多咨询几天前&#xff0c;PHP 社区邮件讨论列表出现了一封“申请援助乌克兰”的邮件&#xff0c;该邮件由非 PHP 开发者发起&#xff0c;目的在于呼吁 PHP 社区火速参与俄乌冲突...邮件机翻译文如下&#xff1a;有意思的是&#xff0c;非 …

放置奇兵最新服务器,放置奇兵开服表

游戏简介&#xff1a;《放置奇兵》是一款全球顶级奇幻RPG手游&#xff0c;派出你的英雄小队&#xff0c;出 发&#xff0c;从碧绿葱葱的萨拉森林到神圣威严的至高天&#xff0c;同数百万玩家一同踏上魔幻旅程&#xff0c;带领你的英雄小队深入古老的废墟&#xff0c;对抗邪恶的…

如何把svn代码拉下来,Maven - 从SVN拉取代码

I am migrating J2ee Project from Ant to Maven,One of The ant tasks is to pull existing source from SVN RepositoryCompile it, and add its jar to my current build as JarIs it possible to do the get the source and compile it in Maven?Thank you!解决方案Yes, i…

jvm内存 大于 xmx_为什么我的JVM访问的内存少于通过-Xmx指定的内存?

jvm内存 大于 xmx“嘿&#xff0c;你能来看看奇怪的东西吗&#xff1f;” 这就是我开始研究支持案例的方式&#xff0c;将我引向了这篇博客文章。 眼前的具体问题与报告可用内存数量不同的不同工具有关。 简而言之&#xff0c;一位工程师正在研究特定应用程序的过多内存使用情…