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