【问题标题】:Netty framework - multiple ports listeningNetty 框架 - 多端口监听
【发布时间】:2018-04-24 12:24:24
【问题描述】:

我有以下问题。我为自己修改了这个例子: Webcam Capture Live Streaming Example

目前,通信看起来像 client1 将图像发送到服务器,然后将服务器的图像发送到 client2。如果我用一台相机工作就没有问题。如果我从两个不同的摄像机流式传输,就会出现问题。我希望 client1 将图像发送到特定端口上的服务器,并且仅在该端口上服务器将图像发送到 client.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)

然后我将客户端 1 连接到端口 2000 的服务器,并将客户端 2 连接到端口 2001。我仍然可以看到来自端口 2000 的图像。

【问题讨论】:

  • 告诉我们您在哪里定义渠道组?

标签: java streaming netty nio ports


【解决方案1】:

我的猜测是您的 channelGroup 在所有客户端的所有线程之间共享?在该 SET 中,您添加所有通道 - 无论他们正在监听哪个端口:

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

来自netty文档herewrite方法的答案:

将指定的消息写入该组中的所有通道。如果 指定的消息是 ByteBuf 的一个实例,它是自动 复制以避免竞争条件。对于 字节缓冲区。请注意,此操作是异步的,因为 Channel.write(Object) 是。

所以你基本上在这里channelGroup.write(msg); 你向所有频道发送相同的消息(图像)。您需要将端口 2000 的通道与端口 2001 上的通道分开。我认为您甚至不需要通道组。只需将端口 2000 的图像发送到为端口 2000 创建的通道。

【讨论】:

  • 我该怎么做?我的假设是一个客户端 1 将图像发送到特定端口上的服务器,服务器将图像发送到该端口上的任意数量的客户端 2。将有几个这样的连接与不同的端口。
  • 发布您的频道组的代码?您需要在特定端口上有一个客户端通道组,而不是通道通道组(基本上是服务器)
  • 老实说,我认为您根本不需要 channelGroup :) 您只需将从特定相机接收到的图像发送到特定通道,目前您通过组
  • 我的频道组是默认的。意思是:protected static final ChannelGroup channelGroup = new DefaultChannelGroup();
  • 这就是我的意思——你得到一个大的频道集合,你将所有频道(所有端口)添加到那个频道组。当您向群组写信时 - 它会将相同的消息写入所有频道。尝试直接写入您需要的频道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2012-03-27
  • 2019-04-04
相关资源
最近更新 更多