Netty框架 - 多个端口监听

时间:2018-04-24 12:24:24

标签: java streaming netty nio ports

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

此时,通信看起来像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);
}

来自client1的代码:

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));
}

。 来自client2的代码:

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)

我用client 2000将client1连接到服务器,然后将client2连接到端口2001.我仍然可以看到来自端口2000的图像。

1 个答案:

答案 0 :(得分:0)

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

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

来自netty文档here write方法的答案:

  

将指定的消息写入此组中的所有频道。如果   指定的消息是ByteBuf的一个实例,它是自动的   重复以避免竞争条件。同样如此   ByteBufHolder。请注意,此操作是异步的   Channel.write(Object)是。

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