Netty框架——多端口监听
Netty framework - multiple ports listening
我有以下问题。我已经为自己修改了这个例子:
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);
}
来自 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)
然后我将客户端 1 连接到端口 2000 的服务器,并将客户端 2 连接到端口 2001。我仍然可以看到来自端口 2000 的图像。
我猜你的 channelGroup 是在所有客户端的所有线程之间共享的?在该 SET 中,您添加所有频道 - 无论他们正在收听哪个端口:
Channel channel = serverBootstrap.bind(streamAddress);
channelGroup.add(channel); //I guess all channels are added here
来自 netty 文档的答案 here write
方法:
Writes the specified message to all Channels in this group. If the
specified message is an instance of ByteBuf, it is automatically
duplicated to avoid a race condition. The same is true for
ByteBufHolder. Please note that this operation is asynchronous as
Channel.write(Object) is.
所以你基本上在这里 channelGroup.write(msg);
你向所有频道发送相同的消息(图像)。您需要将端口 2000 的通道与端口 2001 上的通道分开。我认为您甚至不需要通道组。只需将端口 2000 的图像发送到为端口 2000 创建的通道即可。
我有以下问题。我已经为自己修改了这个例子: 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);
}
来自 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)
然后我将客户端 1 连接到端口 2000 的服务器,并将客户端 2 连接到端口 2001。我仍然可以看到来自端口 2000 的图像。
我猜你的 channelGroup 是在所有客户端的所有线程之间共享的?在该 SET 中,您添加所有频道 - 无论他们正在收听哪个端口:
Channel channel = serverBootstrap.bind(streamAddress);
channelGroup.add(channel); //I guess all channels are added here
来自 netty 文档的答案 here write
方法:
Writes the specified message to all Channels in this group. If the specified message is an instance of ByteBuf, it is automatically duplicated to avoid a race condition. The same is true for ByteBufHolder. Please note that this operation is asynchronous as Channel.write(Object) is.
所以你基本上在这里 channelGroup.write(msg);
你向所有频道发送相同的消息(图像)。您需要将端口 2000 的通道与端口 2001 上的通道分开。我认为您甚至不需要通道组。只需将端口 2000 的图像发送到为端口 2000 创建的通道即可。