我使用netty创建了一个客户端 - 服务器示例。 我已经为服务器和客户端定义了处理程序。 基本上我将客户端连接到服务器并发送一些消息。 每个收到的消息都会被发回(消息的内容被转换为大写)。 在服务器端和客户端,所接收消息的所有工作都由定义的处理程序完成。
但我想直接在客户端使用或更好地接收/接受某些消息 不是(只)在处理程序中。所以我的问题是有可能让一些监听器直接在客户端程序中接收消息,而不是在其处理程序中。瘦是我想访问(可执行)程序(基本上是带有main方法的类)中接收到的消息,这些消息创建了一个新的客户端对象,使用类似定时器的定时器(或循环)定期检查新的消息。
如果有人可以帮我解决这个问题,我将不胜感激。或者至少告诉我它是否有可能与netty。
答案 0 :(得分:1)
您希望将netty的基于事件的模型转换为轮询模型。一种简单的方法是创建一个消息队列:
//import java.util.concurrent.BlockingQueue;
//import java.util.concurrent.LinkedBlockingQueue;
BlockingQueue queue = new LinkedBlockingQueue();
您需要将队列作为构造函数参数提供给处理程序,当消息到达时,您将其放入队列中:
// Your netty handler:
queue.put(message);
在客户端,您可以轮询队列中的消息:
// The polling loop in your program:
message = queue.poll(5, TimeUnit.SECONDS);
BlockingQueue
让您可以选择等待邮件到达(take()
),等待一段时间来邮件到达(poll(long, TimeUnit)
),还是只是检查是否有任何消息现在可用(poll()
)。
从设计角度来看,这种方法会杀死netty应该给你的非阻塞IO优势。您可以使用正常的Socket
连接获得相同的净结果。