使用Mina框架开发 QQ Android 客户端(3) 登陆功能的实现

在博客中有登陆界面的文章http://blog.csdn.net/vestigge/article/details/8124674

就不在重复了,直接看登陆的代码,

用Mina传递字符串上节已经看过了,要实现传递对象,也非常简单,只需要修改一下过滤器:

chain.addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));

在Android客户端,登陆的Activity中:

public class LoginActivity extends Activity{
	private EditText accountEditText;
	private EditText passwordEditText;
	private CheckBox remeberCheckBox;
	
	 public void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        requestWindowFeature(Window.FEATURE_NO_TITLE);
	        setContentView(R.layout.activity_login);
	        accountEditText=(EditText) findViewById(R.id.login_account);
			passwordEditText=(EditText) findViewById(R.id.login_password);
			remeberCheckBox=(CheckBox) findViewById(R.id.login_remember);
			
			findViewById(R.id.login_login).setOnClickListener(new OnClickListener(){
				public void onClick(View v) {
					if(accountEditText.getText().toString().equals("") || 
							passwordEditText.getText().toString().equals("")){
						Toast.makeText(LoginActivity.this, "账号或密码不能为空!", Toast.LENGTH_SHORT).show();
					}else{
						User user=new User();
						user.setAccount(Integer.parseInt(accountEditText.getText().toString()));
						user.setPassword(passwordEditText.getText().toString());
						user.setOperation(VQMessageType.LOGIN);
						boolean b=new VQClient().sendLoginInfo(user);
						//如果登录成功
						if(b){
							Toast.makeText(LoginActivity.this, "登陆成功!", Toast.LENGTH_SHORT).show();
							startActivity(new Intent(LoginActivity.this,MainActivity.class));
						}else{
							Toast.makeText(LoginActivity.this, "连接超时,登陆失败!", Toast.LENGTH_SHORT).show();
						}
					}
				}
			});
	 }
}

可以看到会调用VQClient这个类中的方法去发送登陆请求,VQClient的实现:

public class VQClient {
	private static int PORT=5469;
	public boolean sendLoginInfo(User u){
		boolean b=false;
		System.setProperty("java.net.preferIPv6Addresses", "false");//2.2会有ipv6的问题,
		SocketConnector connector = new NioSocketConnector();
		connector.setConnectTimeoutMillis(300000);
		DefaultIoFilterChainBuilder chain=connector.getFilterChain();
		chain.addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
		SocketSessionConfig cfg = connector.getSessionConfig();
		cfg.setUseReadOperation(true); 
		IoSession session = connector.connect(new InetSocketAddress("10.0.2.2", PORT))  
	            .awaitUninterruptibly().getSession();
		//发送并等待完成
		session.write(u).awaitUninterruptibly();
		//接收
		ReadFuture readFuture = session.read();
		//接收超时
		if (readFuture.awaitUninterruptibly(30000,TimeUnit.SECONDS)) {  
            VQMessage message = (VQMessage) readFuture.getMessage();
            //如果是登陆成功的信息
            if(message.getType().equals(VQMessageType.SUCCESS)){
            	b= true;
            }
        } else {
        	b= false;
        } 
		//断开连接
		session.close(true);  
        session.getService().dispose(); 
        return b;
	}
}

然后服务器端变化不大,在收到登陆请求后,会查询数据库,返回一个信息,来表明登陆成功或者失败。

public void messageReceived(IoSession session, Object message)
			throws Exception {
		User user=(User) message;
		if(user.getOperation().equals(VQMessageType.LOGIN)){
			//操作数据库
			boolean b=new UserDao().login(user.getAccount(), user.getPassword());
			if(b){
				System.out.println(">> ["+user.getAccount()+"] 上线了");
				//告诉客户端登陆成功
				VQMessage m=new VQMessage();
				m.setType(VQMessageType.SUCCESS);
				session.write(m);
			}
		}
	}

最后附上测试效果:



  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值