Netty framework - прослушивание нескольких портов - PullRequest
0 голосов
/ 24 апреля 2018

У меня следующая проблема. Я изменил этот пример для себя: Пример веб-камеры Capture Live Streaming

В данный момент связь выглядит так, как client1 отправляет изображение на сервер, а изображение с сервера отправляется на client2. Нет проблем, если я работаю с одной камерой. Проблемы начинаются, если я смотрю с двух разных камер. Я хотел бы, чтобы client1 отправлял изображение на сервер через определенный порт, и только через этот порт сервер отправляет изображение клиенту.2 В настоящий момент (я не знаю, почему) дело в том, что получает сервер например, на порту 2000 он отправляет все порты, а не только порт 2000. Вы можете мне помочь?

Некоторый код с сервера:

@Override
public void start(SocketAddress streamAddress) {
    logger.info("server started:{}", streamAddress);
    Channel channel = serverBootstrap.bind(streamAddress);
    channelGroup.add(channel);
}

.

    this.serverBootstrap = new ServerBootstrap();
    this.serverBootstrap.setFactory(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
    this.serverBootstrap.setPipelineFactory(new StreamServerChannelPipelineFactory(new StreamServerListenerIMPL(), streamFrameListener));

.

public static void send(BufferedImage image) throws Exception {
    Object msg = h264StreamEncoder.encode(image);
    channelGroup.write(msg);
}

Код от клиента1:

public static void init(String host, int port) {
    Webcam webcam = Webcam.getWebcams().get(0);

    Dimension sizeVideo = WebcamResolution.QVGA.getSize();
    webcam.setViewSize(sizeVideo);

    StreamAtmAgent atmAgent = new StreamAtmAgent(webcam, sizeVideo);
    atmAgent.connect(new InetSocketAddress(host, port));
}

. Код от клиента2:

public static void init(String host, int port, ImageListener il) {
    displayWindow.setVisible(true);
    logger.info("Ustawione wymiary :{}", dimension);
    StreamClientAgent clientAgent = new StreamClientAgent(il, dimension);
    clientAgent.connect(new InetSocketAddress(host, port));
}

Вы можете мне помочь? Если вам нужно больше кода, скажите мне.

P.S Когда я делаю что-то подобное на стартовом сервере:

init("localhost",2000)
init("localhost",2001)

И я подключаю свой client1 к серверу с портом 2000, и я подключаю client2 к порту 2001. Я все еще вижу изображение с порта 2000.

1 Ответ

0 голосов
/ 24 апреля 2018

Полагаю, ваша группа каналов используется всеми потоками для всех клиентов?В этом наборе вы добавляете все каналы - независимо от того, какой порт они слушают:

 Channel channel = serverBootstrap.bind(streamAddress);
 channelGroup.add(channel); //I guess all channels are added here

Ответ из документации Netty здесь write метод делает:

Записывает указанное сообщение всем каналам в этой группе.Если указанное сообщение является экземпляром ByteBuf, оно автоматически дублируется, чтобы избежать условия гонки.То же самое верно для ByteBufHolder.Обратите внимание, что эта операция асинхронна, как Channel.write (Object).

Таким образом, вы, в основном, channelGroup.write(msg); отправляете одно и то же сообщение (изображение) на все каналы.Вы должны отделить канал для порта 2000 от канала на порту 2001. Я не думаю, что вам даже нужна группа каналов.Просто отправьте образ для порта 2000 на канал, созданный для порта 2000.

...