Как часть моего протокола, я бы хотел, чтобы клиент отправлял свой номер версии при установлении нового соединения. Я хотел бы, чтобы это было сделано в отдельном обработчике в конвейере, поэтому, пожалуйста, потерпите меня, так как это может быть довольно простой вопрос, но я не уверен, как это сделать. Другое дело, что я хотел бы затем иметь возможность отправлять POJO туда и обратно через соединение (конвейер). Также я хотел бы добавить обработчик аутентификации. В любом случае, сейчас я получаю какую-то ошибку, и я почти уверен, что это потому, что проверка версии не была правильно обработана из конвейера.
В основном код, который я имею ниже, настроен для отправки «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
}
Итак, в основном я хочу, чтобы номер версии передавался и проверялся, когда канал подключен как часть протокола связи. Все делается автоматически за кадром. Точно так же я хотел бы передать механизм аутентификации таким образом.
Я видел какой-то код, похожий на то, что я хотел сделать с примером безопасного чата, но я не мог понять это. Любая помощь о том, как настроить этот код, будет очень признателен. Я знаю, что мог бы сделать все это одним мощным обработчиком, но в этом и заключается смысл конвейера - разбить его на блоки, которые имеют логический смысл.