Netty代理示例中ctx.write(Unpooled.EMPTY_BUFFER)的用途是什么(What's the purpose of ctx.write(Unpooled.EMPTY_BUFFER) in Netty proxy example)

在Netty 代理示例的 HexDumpProxyBackendHandler中, channelActive方法的代码如下:

public void channelActive(ChannelHandlerContext ctx) {
    ctx.read();
    ctx.write(Unpooled.EMPTY_BUFFER);
}

我的问题是ctx.write(Unpooled.EMPTY_BUFFER)的目的是什么? 在通道激活后是否需要发送空的TCP消息帧?


In HexDumpProxyBackendHandler of Netty proxy example , the code of the method channelActive likes following:

public void channelActive(ChannelHandlerContext ctx) {
    ctx.read();
    ctx.write(Unpooled.EMPTY_BUFFER);
}

My question is what's the purpose of ctx.write(Unpooled.EMPTY_BUFFER)? Is it necessary to send an empty TCP message frame after the channel active?


原文:https://stackoverflow.com/questions/33030331
2023-04-18 10:04

满意答案

Node.js是制作实时框架以将用户链接到RESTful后端的不错选择。 但是,您也可以考虑使用托管实时消息服务(如PubNub)实时在用户和PHP后端之间传递数据。

使用PubNub的PHP Api ,您可以设置服务器以侦听事件:

$pubnub = new Pubnub(
    "demo",  ## PUBLISH_KEY
    "demo",  ## SUBSCRIBE_KEY
    "",      ## SECRET_KEY
    false    ## SSL_ON?
);
$pubnub->subscribe(array(
    'channel'  => 'hello_world',        ## REQUIRED Channel to Listen
    'callback' => function($message) {  ## REQUIRED Callback With Response
        ## Do all the awesome stuff your server does
        return true;         ## Keep listening (return false to stop)
    }
));

现在您的服务器已订阅您的频道,您也可以让您的客户订阅,以收听全球事件。 我将从JavaScript SDK中给出一个示例,但是每个大型移动平台都有一个SDK:

     var pubnub = PUBNUB.init({
         publish_key   : 'demo',
         subscribe_key : 'demo'
     })

     function publish() {
         pubnub.publish({
             channel : "hello_world",
             message : "Bob added Stan as a friend"
         })
     }
 })();

您也可以反向执行此操作,以将消息从服​​务器广播到客户端。 巴姆!

最终,您可能希望为每个用户扩展您的应用程序,以便能够与服务器进行私密通信,以及身份验证; 我们称之为PubNub Access Manager,它受到了很大的支持。

祝你好运!


Node.js is a good choice to make a realtime framework to link your users to your RESTful backend. However, you may also consider using a hosted realtime messaging service such as PubNub to pass data between your users and your PHP backend in real time.

Using PubNub’s PHP Api, you can set up your server to listen for events:

$pubnub = new Pubnub(
    "demo",  ## PUBLISH_KEY
    "demo",  ## SUBSCRIBE_KEY
    "",      ## SECRET_KEY
    false    ## SSL_ON?
);
$pubnub->subscribe(array(
    'channel'  => 'hello_world',        ## REQUIRED Channel to Listen
    'callback' => function($message) {  ## REQUIRED Callback With Response
        ## Do all the awesome stuff your server does
        return true;         ## Keep listening (return false to stop)
    }
));

Now that your server is subscribed to your channel, you can have your clients subscribe as well, to listen for global events. I’m going to give an example from the JavaScript SDK, but there’s an SDK for every sizable mobile platform as well:

     var pubnub = PUBNUB.init({
         publish_key   : 'demo',
         subscribe_key : 'demo'
     })

     function publish() {
         pubnub.publish({
             channel : "hello_world",
             message : "Bob added Stan as a friend"
         })
     }
 })();

You can also do this in reverse, to broadcast messages from the server to the clients. Bam!

Eventually you may want to extend your app with a unique channel for each user to be able to communicate privately with the server, and also authentication; we call this PubNub Access Manager and it is heavily supported.

Good luck!

相关问答

更多

使用Node.js和Express进行简单的API调用(Simple API Calls with Node.js and Express)

您无法使用Express获取内容,您应该使用Mikeal的请求库来实现该特定目的。 该库的API非常简单: var request = require('request'); request('http://www.google.com', function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body) // Print the google web pag...

Node.JS等待发出HTTP请求的REST Service的回调(Node.JS Wait for callback of REST Service that makes HTTP request)

通常的做法是使用异步模块。 npm install async async模块具有原语来处理各种形式的异步事件。 在你的情况下, async#parallel调用将允许你同时向所有外部API发出请求,然后将结果合并返回给你的请求者。 由于您正在提出外部http请求,因此您可能会发现请求模块也很有用。 npm install request 使用request和async#parallel你的路由处理程序看起来像这样... var request = require('request'); va...

为什么node.js一次只处理六个请求?(Why is node.js only processing six requests at a time?)

Node本身没有施加TCP连接限制。 (总而言之,它是高度并发的,可以处理数千个并发连接。)您的操作系统可能会限制TCP连接。 您可能会遇到某种限制您的后台服务器,或者您正在打入内置HTTP库的连接限制,但很难说没有关于该服务器或Node实现的更多细节。 节点的内置HTTP库 (显然,任何建立在它上面的库,大多数)是通过Agent类维护一个连接池,以便它可以利用HTTP保持活动。 当您向同一台服务器运行许多请求时,这有助于提高性能,而不是打开TCP连接,进行HTTP请求,获取响应,关闭TCP连接以...

Node.js - 带cookie的多个请求(Node.js - multiple requests with cookies)

对于nodejs中的流控制,我建议你使用async 如果你想并行执行而没有执行顺序: async.parallel([ function(callback) { request(apiCall1Options, callback); }, function(callback) { request(apiCall2Options, callback); } ], function(err, apiCallResults) { console.log(apiCallRe...

Node.js所有请求的静态头(Node.js static header for all requests)

像这样 app.use(function(req, res, next) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'X-Requested-W...

使用node.js向Google API发出http请求(Making http request to Google API with node.js)

你可能不只是从正在进行的HTTP GET调用中返回一些东西。 这就是它超时的原因。 如果错误未eval为true,则需要发回HTTP 200,例如: res.send(); You're probably not just returning something from the HTTP GET call you're doing. That's why it times out. You need to send back a HTTP 200 if error does not eval ...

API.ai Node.js webhook的缓存响应(Caching response for API.ai Node.js webhook)

给出的所有答案对于解决请求方面的缓存问题都是合理的。 但是,由于您指定了API.AI和Actions,因此您可能还需要在对话进行时存储信息。 您可以使用API.AI上下文执行此操作。 甚至可能是如果您将其限制为仅针对来自用户的每个响应的一个远程调用,您可能能够在时间范围内适应它。 例如,如果您正在进行有关电影时间和故障单排序的对话,则对话可能会像: 用户:“我想看电影。” [您使用API查找最近的剧院,将剧院的位置存储在上下文中并回复]“您最近的剧院是Mall Megaplex。您对那里有兴趣吗?...

401.在Node.js中的GCM请求(401 on GCM requests in Node.js)

由于您使用NodeJS作为Web服务器,因此请使用IP地址API密钥类型而不是“无”。 Since you are using NodeJS as web server, use the IP Addresses API key type instead of None.

使用node.js向API发出请求(Making requests to API using node.js)

Node.js是制作实时框架以将用户链接到RESTful后端的不错选择。 但是,您也可以考虑使用托管实时消息服务(如PubNub)实时在用户和PHP后端之间传递数据。 使用PubNub的PHP Api ,您可以设置服务器以侦听事件: $pubnub = new Pubnub( "demo", ## PUBLISH_KEY "demo", ## SUBSCRIBE_KEY "", ## SECRET_KEY false ## SSL_ON? ); ...

更大的项目Node.js和RESTful API(Bigger projects Node.js and RESTful API)

在我看来,如果你想构建复杂的或大的API,Express是一个很好的方法。 它可以轻松测试(例如使用Mocha或Jasmine)并可自定义,特别是由于它的中间件 。 对于目录结构,我通常使用的是(至少)以下内容: app.js :主要入口点。 将创建快速应用程序,指示每个路由前缀使用哪个控制器,并分配中间件。 上一个项目的示例 控制器 :将包含控制器,将处理请求的函数,与标准MVC框架(例如UserController,...)中的样式相同。 每个控制器都会创建一个快速的Router对象并将其导出...

相关文章

更多

[Netty 1] 初识Netty

1. 简介 最早接触netty是在阅读Zookeeper源码的时候,后来看到Storm的消息传输层也由 ...

Netty源码分析

Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户 ...

storm学习之Netty代替ZMQ

整理自 http://www.csdn.net/article/2014-08-04/2821018/ ...

Netty基于流的传输处理

​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器 ...

Netty入门实例-时间服务器

Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

Netty入门实例-使用POJO代替ByteBuf

使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

在Twitter,Netty 4 GC开销降为五分之一

原文:http://www.infoq.com/cn/news/2013/11/netty4-twit ...

Netty环境配置

netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

Netty开发环境配置

最新版本的Netty 4.x和JDK 1.6及更高版本

Netty入门实例-编写服务器端程序

channelRead()处理程序方法实现如下

最新问答

更多

获取MVC 4使用的DisplayMode后缀(Get the DisplayMode Suffix being used by MVC 4)

我用Google搜索了一个解决方案。 “EnumDisplayModeProvider”是我自己设置网站的各种模式的枚举。 public EnumDisplayModeProvider GetDisplayModeId() { foreach (var mode in DisplayModeProvider.Instance.Modes) if (mode.CanHandleContext(HttpContext)) {

如何通过引用返回对象?(How is returning an object by reference possible?)

这相对简单:在类的构造函数中,您可以分配内存,例如使用new 。 如果你制作一个对象的副本,你不是每次都分配新的内存,而是只复制指向原始内存块的指针,同时递增一个也存储在内存中的引用计数器,使得每个副本都是对象可以访问它。 如果引用计数降至零,则销毁对象将减少引用计数并仅释放分配的内存。 您只需要一个自定义复制构造函数和赋值运算符。 这基本上是共享指针的工作方式。 This is relatively easy: In the class' constructor, you allocate m

矩阵如何存储在内存中?(How are matrices stored in memory?)

正如它在“熵编码”中所说的那样,使用Z字形图案,与RLE一起使用,在许多情况下,RLE已经减小了尺寸。 但是,据我所知,DCT本身并没有给出稀疏矩阵。 但它通常会增强矩阵的熵。 这是compressen变得有损的点:输入矩阵用DCT传输,然后量化量化然后使用霍夫曼编码。 As it says in "Entropy coding" a zig-zag pattern is used, together with RLE which will already reduce size for man

每个请求的Java新会话?(Java New Session For Each Request?)

你是如何进行重定向的? 您是否事先调用了HttpServletResponse.encodeRedirectURL()? 在这里阅读javadoc 您可以使用它像response.sendRedirect(response.encodeRedirectURL(path)); The issue was with the path in the JSESSIONID cookie. I still can't figure out why it was being set to the tomca

css:浮动div中重叠的标题h1(css: overlapping headlines h1 in floated divs)

我认为word-break ,如果你想在一个单词中打破行,你可以指定它,这样做可以解决问题: .column { word-break:break-all; } jsFiddle演示。 您可以在此处阅读有关word-break属性的更多信息。 I think word-break, with which you can specify if you want to break line within a word, will do the trick: .column { word-break

无论图像如何,Caffe预测同一类(Caffe predicts same class regardless of image)

我认为您忘记在分类时间内缩放输入图像,如train_test.prototxt文件的第11行所示。 您可能应该在C ++代码中的某个位置乘以该因子,或者使用Caffe图层来缩放输入(请查看ELTWISE或POWER图层)。 编辑: 在评论中进行了一次对话之后,结果发现在classification.cpp文件中错误地删除了图像均值,而在原始训练/测试管道中没有减去图像均值。 I think you have forgotten to scale the input image during cl

xcode语法颜色编码解释?(xcode syntax color coding explained?)

转到: Xcode => Preferences => Fonts & Colors 您将看到每个语法高亮颜色旁边都有一个简短的解释。 Go to: Xcode => Preferences => Fonts & Colors You'll see that each syntax highlighting colour has a brief explanation next to it.

在Access 2010 Runtime中使用Office 2000校对工具(Use Office 2000 proofing tools in Access 2010 Runtime)

你考虑过第三方拼写检查吗? 您可以将在C#中开发的自定义WinForms控件插入访问数据库吗? VB6控件怎么样? 如果你能找到一个使用第三方库进行拼写检查的控件,那可能会有效。 Have you considered a third party spell checker? Can you insert a custom WinForms controls developed in C# into an access database? What about a VB6 control? If

从单独的Web主机将图像传输到服务器上(Getting images onto server from separate web host)

我有同样的问题,因为我在远程服务器上有两个图像,我需要在每天的预定义时间复制到我的本地服务器,这是我能够提出的代码... try { if(@copy('url/to/source/image.ext', 'local/absolute/path/on/server/' . date("d-m-Y") . ".gif")) { } else { $errors = error_get_last(); throw new Exception($err

从旧版本复制文件并保留它们(旧/新版本)(Copy a file from old revision and keep both of them (old / new revision))

我不确定我完全明白你在说什么。 你能编辑你的帖子并包含你正在做的Subversion命令/操作的特定顺序吗? 最好使用命令行svn客户端,以便容易为其他人重现问题。 如果您只是想获取文件的旧副本(即使该文件不再存在),您可以使用如下命令: svn copy ${repo}/trunk/moduleA/file1@${rev} ${repo}/trunk/moduleB/file1 其中${repo}是您的存储库的URL, ${rev}是您想要的文件的版本。 这将恢复该文件的旧版本,包括最高版本