当前位置: 代码迷 >> Android >> 施用Mina框架开发 QQ Android 客户端(3) 登陆功能的实现
  详细解决方案

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

热度:534   发布时间:2016-05-01 13:03:53.0
使用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);			}		}	}

最后附上测试效果:



  相关解决方案