XMPP : 是即时通讯协议,基于 XML .
Openfire :是一个 XMPP 协议的Java实现的IM服务器程序,底层使用 Mina 框架。
基于环信 IM 长连接技术,支持亿级用户同时在线。
基于WEB的即时消息传输平台,原来的JiveMessenger.
开源的实时协作RTC服务器,基于XMPP协议,构建高效率的通信服务器。利用WEB进行管理。
Smack :是开源、易于使用的 XMPP(jabber) 客户端类库。java写的xmpp客户端代码库。是 Spark 的核心代码。接收消息,监听器
优点:编程简单
缺点:每个客户要1个线程,占用资源大。
XMPPConnection connection = new XMPPConnection("jabber.org");
connection.login("mtucker","password");
connection.createChat("[email protected]").sendMessage("Howdy!");
Asmack :2010年初,A 代表Android版本的 Smack 的android版本。精简后的 smack 开发包。
Spark : 即时通讯客户端,是开源项目。Java 编写。代码实现采用smark类库。客户端采用 Spark 服务器采用 Openfire 是比较通用和常见实现
即时通讯系统的框架。
AndroidPN : Android Push Notification.
关于持久化连接的实现:1,基于IBM的 MQTT 。2,基于 XMPP实现。
Mina :Apache MINA(Multipurpose Infrastructure for Network Applications),当前支持java NIO 技术的 TCP/UDP
应用程序开发、串口通讯程序,所支持的正在进一步扩展中。
包含4个jar包:mina-core.jar
slf4j-log4j.jar slf4j-api.jar
log4j.jar
//
//服务端
//
private static Logger logger = Logger.getLogger(DemoServer.class);//日志类的实现
NioSocketAcceptor acceptor = new NioSocketAcceptor();//创建一个非阻塞的Socket
acceptor.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue())
));//设置过滤器,(使用mina提供的文本换行符编解码器)
acceptor.getFilterChain().addLast("keeplive",new keepAliveFilter(new ServerKeepAliveMessageFactoryImp()
,IdleStatus.READ_IDLE
,KeepAliveRequestTimeoutHandler.CLOSE
,10
,5));
// acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new CharsetCodescFactory()));
//自定义的编解码器。
acceptor.getSessionConfig().setReadBufferSize(2048);//设置读取数据的缓冲区的大小
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);//读取通道10秒内误操作进入空闲状态
acceptor.setHandler(new Demo1Serverhandler());//为接收器设置管理服务
acceptor.bind(new InetSocketAddress(PORT(自己定义的端口号)));//绑定端口
logger.info("服务器启动 。。。");
public class Demo1Serverhandler extends IoHandlerAdapter{
public static Logger logger = Logger.getLogger(Demo1Serverhandler.class);
@override
public void messageReceived(IoSession session,Object message) throws Exception{
String msg = message.toString();
if("exit".equals(msg)){
session.close(true);
}
Date date = new Date();
session.write(date);
logger.info("服务器接收信息成功。");
super.messageReceived(session,message);
}
@override
public void sessionClosed(IoSession session) throws Exception{
logger.info("服务器与客户端断开连接");
super.sessionClosed(session);
}
@override
public void sessionOpened(IoSession session) throws Exception{
logger.info("服务器与客户端连接打开。。。。");
super.sessionIdle(session,status);
}
@override
public void sessionIdle(IoSession session,IdleStatus status) throws Exception{
logger.info("进入空闲状态。。。");
super.sessionIdle(session,status);
}
@override
public void exceptionCaught(IoSession session,Throwable cause) throws Exception{
logger.info("服务器发送异常。。。");
super.exceptionCaught(session,cause);
}
}
//
//客户端
//
IoConnector connector = new NioSocketConnector();
connector.setConnectTimeoutMillis(30000);//设置超时
//添加过滤器
// connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new CharsetCodescFactory()));
connector.getFilterChain().allLast("codec",new ProtocolCodecFilter(
new TextLineCodecFactory(Charset.forName("UTF-8"),LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())
));
ConnectFuture future = connector.connect(new InetSocketAddress(ConstantUtils.WEB_MATCH_PACH
,ConstantUtils.WEB_MATCH_PORT));//创建连接
future.awaitUninterruptibly();//等待连接创建完成
session = future.getSession();//获得session
session.write("start");
session.getCloseFuture().awaitUninterruptibly();//等待连接断开
connector.dispose();
//拿到所有客户端的 Session。
Collection<IoSession> sessions = session.getService().getManagedSessins().values();