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 }

最后测试一下:

 

 

 

 

 

 

 

 

 

谢谢大家支持!欢迎一起学习交流!

 

 

 

 

 

posted @ 2013-01-26 11:33  王世桢  阅读(282)  评论(0编辑  收藏  举报