我大部分都是使用Netty,但有一個概念仍然在暗示着我,而我在教程中找不到任何東西等等。首先,我明白Netty是異步的,但必須有一種方式讓客戶端調用服務器,並能夠在處理程序之外獲得響應。讓我再解釋一下。Netty - 如何在客戶端獲得服務器響應
我有一個客戶,如下圖所示。請注意,我知道它已啓動,每次通話都會建立一個新的連接,這只是爲了讓這個例子變得更小,更簡潔。請忽略這個事實。
Client.java
// ServerResponse is a result from the server, in this case
// a list of users of the system (ignore that each time it's all bootstrapped).
public User[] callServerForInformationFromGUIWidget()
{
ClientBootstrap bootstrap = new ClientBootstrap(...);
bootstrap.setPipelineFactory(...);
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
Channel channel = future.awaitUninterruptibly().getChannel();
// Where request is a POJO sent to the server,
// with a request such as get me a list of users
RequestPojo request = new RequestPojo(requestUserListCommand);
ChannelFuture lastWriteFuture = channel.write(request);
if(lastWriteFuture != null)
lastWriteFuture.awaitUninterruptibly();
}
現在我明白瞭如何獲取服務器上的數據,和還擊的結果。唯一的問題是我如何在客戶端處理它?是的ClientHandler的類可以做類似如下:
ClientHandler.java
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
{
User[] users = (User[])e.getMessage();
}
的問題是如何在客戶端代碼實際上得到這一結果?所有的例子都類似於聊天服務,在那裏事件觸發客戶端上沒有等待響應的其他事物。即使是我發現缺乏這個的http客戶端示例。整個文檔非常好,但缺乏如何回調的問題。無論如何,在這種情況下,我需要客戶端從服務器獲得響應,並根據結果來執行所需的操作。
換句話說,我怎麼寫的客戶做這樣的事情:
IdealClient.java
// ServerResponse is a result from the server, in this case
// a list of users of the system.
public User[] callServerForInformationFromGUIWidget()
{
...
RequestPojo request = new RequestPojo(requestUserListCommand);
ChannelFuture lastWriteFuture = channel.write(request);
if(lastWriteFuture != null)
lastWriteFuture.awaitUninterruptibly();
User[] users = resultFromCallToServer();
performSomeAction(users);
}
因爲處理程序不知道是誰在尋找的答案,或者誰問這個問題。如果它在處理程序中完成,比如何?
回到我對這些示例的評論,http客戶端(和處理程序)示例只是將結果轉儲到System.out。如果你有一個GUI,你會如何將你的請求的結果傳遞給GUI?我從來沒有見過這樣的例子。
我試圖按照你的指引來註冊監聽器,但我得到一個「不兼容的類型:字符串不能轉換爲DataChangeEvent」......出了什麼問題?謝謝。 – Phobox 2016-03-09 09:10:31