Netty 3.9 setTrafficClass()方法似乎确实有效

时间:2014-11-22 19:43:14

标签: netty

我使用的是Netty 3.9.5并使用了本页列出的代码:http://en.wikipedia.org/wiki/Netty_%28software%29#Netty_TCP_Example来构建一个简单的服务器程序和客户端程序。我的两台机器都是Windows 7,而我使用的是JDK 1.8。这些程序运作良好。

我当前的项目要求我为我从客户端发送到服务器的数据包设置DSCP代码。以下是我添加到Netty客户端示例中的相关代码。

    Channel comLink = connection.getChannel();

    /* Hopefully this will set the traffic class in the channel. */

    SocketChannelConfig cfg = (NioSocketChannelConfig) comLink.getConfig();
    cfg.setTrafficClass(0x08);
//  cfg.setOption("trafficClass", 8);
    System.out.println("The traffic class is " + cfg.getTrafficClass());

如果我使用setTrafficClass或setOption并不重要。始终打印的值为0.此外,客户端和服务器上的Wireshark显示为0。

我还需要做些什么吗?我的最终目标是让程序在Windows和Ubuntu下运行。如果使用java.net.Socket,我已经看过有关setTrafficClass问题的Windows文章,但我不知道这是否与任何方式有关。

我假设有一些我不理解的东西,任何正确方向的帮助或指导都会受到赞赏。

非常感谢

菲尔

1 个答案:

答案 0 :(得分:0)

我不确定但是根据Socket类的Java文档:

  

RFC 1122第4.2.4.2节指出,符合TCP的实现   应该,但不是必须让应用程序更改TOS字段   在连接的生命周期中。所以是否是服务类型   建立TCP连接后,可以更改字段   取决于底层平台的实现。应用   不应该假设他们可以改变后的TOS字段   连接。

所以我想你应该在创建通道之前放置它,所以在BootStrap中,你可能需要做一些事情:

ClientBootstrap bootstrap = ...
bootstrap.setOption("trafficClass", 0x08);

和/或

ServerBootstrap bootstrap = ...
boostrap.setOption("trafficClass", 0x08);//not sure for this one but cost nothing
bootstrap.setOption("child.trafficClass", 0x08);

显然没有保证连接后设置值。 你可以试试......