Android 开发即时聊天工具 YQ :(三) 实现登陆功能
转载声明:http://blog.csdn.net/mimitracely
前面socket基本通信完了,登陆界面也已经完成,下面就是重点了,实现登陆功能
服务器和客户端的代码当然不肯能用那个控制台的那个了,所以全部得重写,不过原理都一样,代码也差不多,都有注释,一看就明白。
先是登陆的Activity:
1 public class LoginActivity extends Activity { 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_login); 5 Button btnLogin=(Button) findViewById(R.id.btn_login); 6 btnLogin.setOnClickListener(new OnClickListener(){ 7 public void onClick(View arg0) { 8 int account=Integer.parseInt(((EditText) findViewById(R.id.et_account)).getText().toString()); 9 String password=((EditText) findViewById(R.id.et_password)).getText().toString(); 10 login(account, password); 11 } 12 }); 13 } 14 15 void login(int a, String p){ 16 User user=new User(); 17 user.setAccount(a); 18 user.setPassword(p); 19 user.setOperation("login"); 20 boolean b=new YQConServer().sendLoginInfo(user); 21 //登陆成功 22 if(b){ 23 try { 24 //发送一个要求返回在线好友的请求的Message 25 <span style="white-space: pre;"> </span>//--- 26 } catch (IOException e) { 27 e.printStackTrace(); 28 } 29 //转到主界面, 30 Intent i=new Intent(this, MainActivity.class); 31 startActivity(i); 32 }else { 33 Toast.makeText(this, "登陆失败!不告诉你为什么,", Toast.LENGTH_SHORT).show(); 34 } 35 } 36 }
将登陆的信息封装到user中,user的operation用来判断该user包的类型,交由YQClient来发送到服务器。
客户端:
1 public class YQClient{ 2 public Socket s; 3 4 public boolean sendLoginInfo(Object obj){ 5 boolean b=false; 6 try { 7 s=new Socket(); 8 try{ 9 s.connect(new InetSocketAddress("10.0.2.2",5469),2000); 10 }catch(SocketTimeoutException e){ 11 //连接服务器超时 12 return false; 13 } 14 ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream()); 15 oos.writeObject(obj); 16 ObjectInputStream ois=new ObjectInputStream(s.getInputStream()); 17 YQMessage ms=(YQMessage)ois.readObject(); 18 if(ms.getType().equals(YQMessageType.SUCCESS)){ 19 //创建一个该账号和服务器保持连接的线程 20 //--- 21 b=true; 22 }else if(ms.getType().equals(YQMessageType.FAIL)){ 23 b=false; 24 } 25 } catch (IOException e) { 26 e.printStackTrace(); 27 } catch (ClassNotFoundException e) { 28 e.printStackTrace(); 29 } 30 return b; 31 } 32 }
在登陆成功后,将会新开一个线程和服务器保持连接,该线程将用来通信,
要捕获SocketTimeoutException异常,否则连接 不到服务器,app会无响应,这里设置2s服务器无响应,则连接服务器超时。
最后在看服务器端:
1 public class YQServer { 2 public YQServer(){ 3 ServerSocket ss = null; 4 try { 5 ss=new ServerSocket(5469); 6 System.out.println("服务器已启动,正在监听5469端口..."); 7 while(true){ 8 Socket s=ss.accept(); 9 //接受客户端发来的信息 10 ObjectInputStream ois=new ObjectInputStream(s.getInputStream()); 11 User u=(User) ois.readObject(); 12 YQMessage m=new YQMessage(); 13 ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream()); 14 15 if(u.getOperation().equals("login")){ //登录 16 int account=u.getAccount(); 17 boolean b=new UserDao().login(account, u.getPassword());//连接数据库验证用户 18 if(b){ 19 System.out.println("["+account+"] 上线了!"); 20 m.setType(YQMessageType.SUCCESS);//返回一个成功登陆的信息包 21 oos.writeObject(m); 22 //单开一个线程,让该线程与该客户端保持连接 23 //--- 24 }else{ 25 m.setType(YQMessageType.FAIL); 26 oos.writeObject(m); 27 } 28 }else if(u.getOperation().equals("register")){ 29 //注册 30 } 31 } 32 } catch (Exception e) { 33 e.printStackTrace(); 34 } 35 } 36 37 }
最后测试一下:
谢谢大家支持!欢迎一起学习交流!