- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为我的协议(protocol)的一部分,我希望客户端在建立新连接时发送其版本号。我希望在管道中的单独处理程序中完成此操作,因此请耐心等待,因为这可能是一个相当基本的问题,但我不确定如何做到这一点。另一件事是我希望能够通过连接(管道)来回发送 POJO。我还想添加一个身份验证处理程序。不管怎样,现在我遇到了某种错误,我很确定这是因为版本检查没有从管道中正确消化。
基本上,我下面的代码设置为发送“Hello World”,服务器在建立连接后检查版本后打印出该“Hello World”。至少在理论上,实际上这不太有效;)
目前我有:
客户端.java
public static void main(String[] args)
{
...
// Set up the pipeline factory.
bootstrap.setPipelineFactory(new ChannelPipelineFactory()
{
@Override
public ChannelPipeline getPipeline() throws Exception
{
return Channels.pipeline(
new ObjectEncoder(),
new ObjectDecoder(),
new VersionClientHandler(),
new BusinessLogicClientHandler());
}
});
...
// The idea is that it will all be request and response. Much like http but with pojo's.
ChannelFuture lastWriteFuture = channel.write("Hello world".getBytes());
if (lastWriteFuture != null)
{
System.out.println("waiting for message to be sent");
lastWriteFuture.awaitUninterruptibly();
}
...
}
VersionClientHandler.java
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
{
ChannelBuffer versionBuffer = ChannelBuffers.buffer(VERSION_STRING_LENGTH);
versionBuffer.writeBytes("v123.45a".getBytes());
// If I understand correctly, the next line says use the rest of the stream to do what you need to the next Handler in the pipeline?
Channels.write(ctx, e.getFuture(), versionBuffer);
}
BusinessLogicClientHandler.java
Not really doing anything at this point. Should it?
服务器.java
public static void main(String[] args)
{
...
public ChannelPipeline getPipeline() throws Exception
{
return Channels.pipeline(
new ObjectEncoder(),
new ObjectDecoder(),
new VersionServerHandler(),
new BusinessLogicServerHandler());
}
...
}
VersionServerHandler.java
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
{
ChannelBuffer versionBuffer = ChannelBuffers.buffer(VERSION_NUMBER_MAX_SIZE);
System.out.println("isReadable - messageReceived: " + versionBuffer.readable()); // returns false???
// Basically I want to read it and confirm the client and server versions match.
// And if the match fails either send a message or throw an exception
// How do I also pass on the stream to the next Handler?
}
BusinessLogicServerHandler.java
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
{
e.getMessage();
byte[] message = (byte[])e.getMessage(); // "Hello World" in byte[] from Client.java
}
所以基本上我想要的是当 channel 作为通信协议(protocol)的一部分连接时传递并验证版本号。一切都在幕后自动完成。同样,我很想通过这种方式通过身份验证机制。
我确实看到了一些代码,看起来有点像我想要在安全聊天示例中执行的操作,但我无法真正弄清楚它。任何有关如何设置此代码的帮助将不胜感激。我知道我可以在一个大型处理程序中完成这一切,但这就是管道的重点,将其分解为具有逻辑意义的单元。
最佳答案
我找到了解决方案!!!
存在很多问题。
在 VersionClientHandler 上,新代码为:
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
{
String verison = "v123.45a";
ChannelBuffer versionBuffer = ChannelBuffers.buffer(VERSION_STRING_LENGTH);
versionBuffer.writeBytes(version.getBytes());
e.getChannel().write(version);
}
注意最后一行,e.getChannel().write(version);
而不是 Channels.write(ctx, e.getFuture(), versionBuffer);
我不确定为什么。 事实上,我即将开始研究为什么我在那里有 ChannelBuffers 代码,因为它似乎没有做任何事情......
在 VersionServerHandler.java 上我现在有:
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
{
String versionCheck = (String)e.getMessage();
System.out.println("VersionServerHandler - " + versionCheck);
ctx.getPipeline().remove(VersionServerHandler.class);
}
请注意,我不再读取缓冲区,我只是执行 e.getMessage()
并强制转换为正确的对象类型。在此之上,我添加了 ctx.getPipeline().remove(VersionServerHandler.class); ,用于从任何进一步的处理中删除该处理程序。初始连接后不再需要它。感谢丹尼斯的提示。
结论
剩下的就和我预想的差不多了。关键是我没有正确理解如何读取缓冲区并传递信息。并且错误消息和示例不是很清楚。一旦将 Netty 中的 POJO channel 添加到管道中,您就需要开始仅处理所有处理程序的对象。我错过了那个。这些概念是正确的,只是我尝试从错误的 channel 读取数据的方式。
另一个重要提示是,如果在初始连接后不需要处理程序,请从管道中删除它们。我认为身份验证处理程序也是如此。如果能在这里得到确认就太好了,但我必须稍后再解决这个问题。
关于java - Netty - 如何测试客户端/服务器版本号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883413/
我正在Mac上开发一个safari插件。现在我想知道safari3,safari4的所有版本号,因为我可以在一些插件示例代码info.plist中看到:MinBundleVersion是5530,我检
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在阅读 http://www.tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html我有一些问题。 版本号、次要版本号和发布号之间有什
是否必须所有用 C++ 创建的 dll 都有版本号?我的机器中有 dll,但是当我右键单击时,我无法看到版本号。 PS:我安装了Win 7。 最佳答案 重要的是要了解,在加载 DLL 期间不会使用版本
我知道 VS 2010 有 F# 2.0 和 VS 2012 - F# 3.0。 但是我如何获得 F# 版本号,例如在 F# 交互中?是否有一些命令,例如:#ver;; ? 谢谢。 最佳答案 当您在
我已经发布了如何在 Eclipse Gallileo 中找到它,但如果有人有有关旧版本的信息,请随时在下面发布。 最佳答案 (2012 年 9 月更新): MRT指出in the comments “
Rational Function Tester 脚本如何确定它在哪个版本的 RFT 下执行/构建? 我仔细研究了文档,发现最接近的是 com.rational.test.ft.script.Scri
我正在使用 Alfresco。我知道如何查看已安装的 Alfresco vesrion 编号,但我需要以编程方式获取此版本号,例如通过 rest API 或某些 http 请求。有可能吗? 最佳答案
我目前正在尝试更新版本号。在 TeamCity 中使用 Nant 构建文件,包含版本号。如果我只是使用 . . 在脚本中,buildNumber 已更新为 2.16.3,但我还希望有此版本号的计数
我想编写一个脚本,它可以递归地扫描目录中的 DLL 并生成所有版本号的报告。 如何使用脚本检测 DLL 的版本号? VBScript 解决方案是首选,除非有更好的方法。 最佳答案 您可以使用 File
我正在开始一个有人在两年前开始的项目,但我无法确定它运行的 django 版本。制作该项目的人不知道,而且我不确定猜测和检查是否有效,因为我实际上不知道该项目是否可以编译。我找到了this答案,但它表
我需要确保可用的 PostgreSQL 版本不低于要求的版本。可以按如下方式请求版本字符串: SELECT VERSION(); 它返回给我类似的东西: PostgreSQL 9.5.4, compi
在我的数据库中,我在列中填写了这些数据: 1 1.1 1.1.1 1.1.1.1 1.1.2 1.10 1.11 1.2 1.9 我想对其进行排序,得到的结果如下所示: 1 1.1 1.1.1 1.1
我正在编写一个脚本,它需要一个简单的短格式的 Bash 版本号。 我知道 bash --version,但这会产生很长的输出: GNU bash, version 4.2.10(1)-release
我将 Grunt 与 php 一起使用,并使用一个包来对我的 css 进行版本控制,并将日期戳记为 style.min.20160913230349.css。 但是我如何找到一个包,将新字符串更新到我
我有一个用 distutils 构建的 python 包,我在我的设置函数中使用版本参数,就像这样(除了名称和版本之外还有其他参数): setup(name='example_module', ver
Windows EXE 文件附有版本号,由以点分隔的四位数字组成(例如 1.0.0.0)。 问题:比较这些数字的正确方法是什么?具体来说,是 1.15.0.0 > 1.2.0.0(因为 15 > 2)
如果我有一个像 这样的 iOS 用户代理 Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532
我正在写一个 Symfony Console PHP应用程序takes a version number in the constructor . $app = new Application('my
我可以使用它们的一些构建语法或 Gradle API 中的某些内容来检查 Gradle 版本号吗? 最佳答案 gradle.gradleVersion 将返回版本号,作为字符串。 关于java - 如
我是一名优秀的程序员,十分优秀!