package streamExample.agent;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.group.ChannelGroup;
import org.jboss.netty.channel.group.DefaultChannelGroup;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import streamExample.channel.StreamServerChannelPipelineFactory;
import streamExample.handler.StreamServerListener;
import java.net.SocketAddress;
import java.util.concurrent.Executors;
public class ForwarderServerAgent implements IStreamServerAgent {
protected final static Logger logger = LoggerFactory.getLogger(ForwarderServerAgent.class);
protected final ServerBootstrap serverBootstrap;
protected final ChannelGroup channelGroup = new DefaultChannelGroup();
public ForwarderServerAgent() {
super();
serverBootstrap = new ServerBootstrap();
this.serverBootstrap.setFactory(new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
this.serverBootstrap.setPipelineFactory(new StreamServerChannelPipelineFactory(
new StreamServerListenerIMPL()));
}
@Override
public void start(SocketAddress streamAddress) {
logger.info("Server started :{}", streamAddress);
Channel channel = serverBootstrap.bind(streamAddress);
channelGroup.add(channel);
}
@Override
public void stop() {
logger.info("server is stoping");
channelGroup.close();
serverBootstrap.releaseExternalResources();
}
public void forwardImage(Object image) {
channelGroup.write(image);
}
private class StreamServerListenerIMPL implements StreamServerListener {
@Override
public void onClientConnectedIn(Channel channel) {
//here we just start to stream when the first client connected in
channelGroup.add(channel);
logger.info("current connected clients :{}", channelGroup.size());
}
@Override
public void onClientDisconnected(Channel channel) {
channelGroup.remove(channel);
int size = channelGroup.size();
logger.info("current connected clients :{}", size);
}
@Override
public void onException(Channel channel, Throwable t) {
channelGroup.remove(channel);
channel.close();
int size = channelGroup.size();
logger.info("current connected clients :{}", size);
}
}
}