在客户端上开发xmpp的注册功能,即带内注册。
带内注册指的是未在服务器上开通账号的用户可以通过xmpp协议注册新账号。相反的概念是带外注册(out-of-band registration),例如
你必须到某个指定的web页面进行注册。
如果服务器允许带内注册,那么我们就可以通过自己开发的客户端注册新账号。与带内注册相关的协议是XEP-0077。
这里需要使用到插件 asmack-jse.jar
由于在Android平台下开发 所以我们用到的是 aSmack,与Smack没有很大的区别
下载地址:http://code.google.com/p/asmack/downloads/list
首先最重要的是配置连接
public static String host = "192.168.1.101"; //自己服务器的IP
public static int port = 5222; //开放端口号,openfire默认是5222
static XMPPConnection connection;
//依葫芦画瓢
static{
XMPPConnection.DEBUG_ENABLED = true;
ConnectionConfiguration configuration = new ConnectionConfiguration(host, port);
connection = new XMPPConnection(configuration);
connection.DEBUG_ENABLED = true;
ProviderManager pm = ProviderManager.getInstance();
configure(pm);
}
注册
Registration reg = new Registration();
reg.setType(IQ.Type.SET);
reg.setTo(MainActivity.connection.getServiceName());
reg.setUsername(usernameEdt.getText().toString());
reg.setPassword(passwdEdt.getText().toString());
reg.addAttribute("android", "geolo_createUser_android");
System.out.println("reg:" + reg);
PacketFilter filter = new AndFilter(new PacketIDFilter(reg
.getPacketID()), new PacketTypeFilter(IQ.class));
PacketCollector collector = MainActivity.connection
.createPacketCollector(filter);
MainActivity.connection.sendPacket(reg);
result = (IQ) collector.nextResult(SmackConfiguration
.getPacketReplyTimeout());
// Stop queuing results
collector.cancel();// 停止请求results(是否成功的结果)
if (result == null) {
Toast.makeText(getApplicationContext(), "服务器没有返回结果",
Toast.LENGTH_SHORT).show();
} else if (result.getType() == IQ.Type.ERROR) {
if (result.getError().toString().equalsIgnoreCase(
"conflict(409)")) {
Toast.makeText(getApplicationContext(), "这个账号已经存在",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "注册失败",
Toast.LENGTH_SHORT).show();
}
} else if (result.getType() == IQ.Type.RESULT) {
Toast.makeText(getApplicationContext(), "恭喜你注册成功",
Toast.LENGTH_SHORT).show();
}
登录
MainActivity.connection.login(usernameEdt.getText().toString(), pwdEdt.getText().toString());
Button loginBtn = (Button) findViewById(R.id.btn_login);
loginBtn.setEnabled(false);
loginBtn.setText("登录成功");