作爲我的協議的一部分,我希望客戶端在建立新連接時發送其版本號。我希望這是在一個單獨的處理程序中完成的,請耐心等待,因爲這可能是一個相當基本的問題,但我不知道該怎麼做。另一件事是我希望能夠通過連接(管道)來回發送POJO。此外,我很想添加一個身份驗證處理程序。無論如何,現在我得到了一些錯誤,我很確定這是因爲版本檢查沒有從管道中正確消化。Netty - 如何測試客戶端/服務器版本號
基本上我下面的代碼設置爲發送「Hello World」,服務器在連接建立後檢查版本後打印出來。至少在理論上,在現實中,這是不太工作;)
目前我有:
Client.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?
Server.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
}
所以基本上我想要的是版本號被傳遞和確認在通道作爲通信協議的一部分進行連接。全部在幕後自動完成。同樣,我很想通過這種方式傳遞認證機制。
我的確看到了一些代碼,看起來有點像我想要用安全聊天的例子,但我無法弄清楚。任何有關如何設置此代碼的幫助將非常感激。我知道我可以在一個大規模的處理程序中完成所有工作,但這是管道的關鍵,將其分解成符合邏輯的單元。
我的想法是版本檢查的處理程序,用於身份驗證的處理程序,用於加密的處理程序以及用於實際業務邏輯的處理程序。 – 2012-01-16 20:52:33
我最大的擔憂是,如果客戶端和服務器是不同的版本,並且您正在序列化POJO,那麼它將在反序列化時失敗。 – 2012-01-16 20:53:12
這是一個很好的觀點。那麼你看到的錯誤是什麼? – 2012-01-17 16:15:09