From:http://blog.youkuaiyun.com/grape875499765/article/details/49968067
在android的app中,有关注册登陆功能十分常见,对于用户来说,第一次使用某个软件势必会涉及到这个问题,所以注册登录功能的实现也是一种基础功能,对于android开发人员也是必备技能,下面将就具体内容进行详细讲解。
一、必备基础
1、java基础和java中的socket编程,如果不懂的话不建议看代码,先把基础弄懂再来看事半功倍
2、android编程基础,至少要会使用最基本的button,edittext控件,会使用layout,否则同上一条
3、运行环境为eclipse
二、功能实现效果
实现注册登录功能需要客户端和服务器共两个工程
一个工程的名字为MyClient,另外一个为MyServer
1、第一步先运行MyServer工程,开启服务器,开启时Console会有提示,服务器回归原点
2、在手机上安装好MyClient,打开app
3、点击注册按钮,同时输入用户和密码,这里举例为 用户名为1,密码为2,点击注册,此时eclipse的console处会有变化
4、输入用户名和密码,点击登录,输入正确和错误在eclipse的console都有消息,输入正确则进入登陆后界面
三、服务器端讲解
话不多说,直接上代码,都在注释里
- package com.test;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class MyServer {
- public static void main(String[] args){
- String saveUsername=new String("admin");
- String savePassword=new String("admin");
- try{
- ServerSocket server=new ServerSocket(6666);
- while(true){
- System.out.println("服务器回归原点");//调试信息
- Socket s1=server.accept();
- System.out.println("接到客户端socket请求");//调试信息
- InputStream is1=s1.getInputStream();
- DataInputStream dis1=new DataInputStream(is1);
- String str=dis1.readUTF();
- System.out.println(str);//调试信息
- //如果发来注册的信息就做如下操作
- if(str.equals("Register")){
- s1=server.accept();
- is1=s1.getInputStream();
- DataInputStream dis2=new DataInputStream(is1);
- String []getStr=dis2.readUTF().split(" ");//用空格把账号和密码分开存储
- saveUsername=getStr[0];//取出账号
- savePassword=getStr[1];//取出密码
- System.out.println(saveUsername+" "+savePassword);//调试信息
- dis2.close();
- }
- //如果发来登录账号和密码做如下操作
- else{
- System.out.println("进入登陆判断");//调试信息
- String []getStr=str.split(" ");//用空格把账号和密码分开存储
- //如果账号和密码都对的话则返回允许登录命令
- if(saveUsername.equals(getStr[0])&&savePassword.equals(getStr[1])){
- OutputStream os=s1.getOutputStream();
- DataOutputStream dos=new DataOutputStream(os);
- dos.writeUTF("YES");
- dos.close();
- System.out.println("用户密码正确");//调试信息
- }
- //如果账号和密码不吻合则返回禁止登录命令
- else{
- OutputStream os=s1.getOutputStream();
- DataOutputStream dos=new DataOutputStream(os);
- dos.writeUTF("NO");
- dos.close();
- System.out.println("用户密码错误");//调试信息
- }
- System.out.println(getStr[0]+" "+getStr[1]);//调试信息
- }
- dis1.close();
- s1.close();
- }
- }catch(IOException e){
- e.printStackTrace();
- }
- }
- }
四、客户端讲解
LogIn.java的代码内容
- package com.example.myclient;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.StrictMode;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.Toast;
- public class LogIn extends Activity{
- private EditText etxtUserName;
- private EditText etxtPassword;
- private Button btnLogin;
- private Button btnRegister;
- //这里要改成所处局域网的ip,也就是你现在手机和电脑同时的ip,在命令行中用ipconfig查看
- private static final String ipAdress="192.168.1.102";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.log_in);
- etxtUserName=(EditText) findViewById(R.id.etxtUserName);
- etxtPassword=(EditText) findViewById(R.id.etxtPassword);
- btnLogin=(Button) findViewById(R.id.btnLogin);
- btnRegister=(Button) findViewById(R.id.btnRegister);
- btnLogin.setOnClickListener(new MyButtonOnClickListener());
- btnRegister.setOnClickListener(new MyButtonOnClickListener());
- }
- /////////////////////////////////////////////////////////////////////////////////////
- class MyButtonOnClickListener implements OnClickListener {
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Intent intent = new Intent();
- switch (arg0.getId()) {
- case R.id.btnLogin:
- try{
- //端口号为6666,自己选择,只要不和电脑中的其他程序冲突即可
- Socket s1=new Socket(ipAdress,6666);
- OutputStream os=s1.getOutputStream();
- DataOutputStream dos=new DataOutputStream(os);
- dos.writeUTF(etxtUserName.getText().toString() + " "
- + etxtPassword.getText().toString());// 向服务器传送登录账号和密码
- //等一秒钟
- new Handler().postDelayed(new Runnable(){
- public void run() {
- //execute the task
- }
- }, 1000);
- //
- InputStream is=s1.getInputStream();
- DataInputStream dis=new DataInputStream(is);
- String getStr=dis.readUTF();//YES或者NO
- if(getStr.equals("YES")){
- intent.setClass(LogIn.this,
- Personal.class);
- LogIn.this.startActivity(intent);
- finish();
- }
- else if(getStr.equals("NO")){
- Toast.makeText(getApplicationContext(), "登录失败",
- Toast.LENGTH_SHORT).show();
- }
- dis.close();
- dos.close();
- s1.close();
- }catch(Exception e){
- e.printStackTrace();
- //开了个后门,可以用这个账号直接登录
- if (etxtUserName.getText().toString().equals("admin")
- && etxtPassword.getText().toString()
- .equals("admin")) {
- intent.setClass(LogIn.this,
- Personal.class);
- LogIn.this.startActivity(intent);
- finish();
- }
- else{
- Toast.makeText(getApplicationContext(), "登录失败 ",
- Toast.LENGTH_SHORT).show();
- }
- }
- break;
- case R.id.btnRegister:
- try{
- /**
- * 从android 4.0以后就不允许这样操作了,因为如果在主线程里联网,
- * 如果网络不好那么整个程序就卡死在那里了。
- * 所以android4.0以后对要联网的代码必须在新开一个线程来做。
- */
- StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
- .detectDiskReads().detectDiskWrites()
- .detectNetwork().penaltyLog().build());
- StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
- .detectLeakedSqlLiteObjects().penaltyLog()
- .penaltyDeath().build());
- Socket s1=new Socket(ipAdress,6666);
- OutputStream os=s1.getOutputStream();
- DataOutputStream dos=new DataOutputStream(os);
- dos.writeUTF("Register");//向服务器传送Register字符
- dos.close();
- s1.close();
- //如果没有异常则跳转到注册界面
- }catch(Exception e){
- e.printStackTrace();
- Toast.makeText(getApplicationContext(), "注册失败 IOException"+e.toString(),
- Toast.LENGTH_SHORT).show();
- }
- intent.setClass(LogIn.this,
- Register.class);
- LogIn.this.startActivity(intent);
- finish();
- break;
- }
- }
- }
- }
Register.java的内容:
- package com.example.myclient;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.net.Socket;
- import java.net.UnknownHostException;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.Toast;
- public class Register extends Activity{
- private EditText etxtUserName;
- private EditText etxtPassword;
- private Button btnRegister;
- private static final String ipAdress="192.168.1.102";
- //////////////////
- protected void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.register);
- etxtUserName=(EditText) findViewById(R.id.etxtUserName);
- etxtPassword=(EditText) findViewById(R.id.etxtPassword);
- btnRegister=(Button) findViewById(R.id.btnRegister);
- btnRegister.setOnClickListener(new MyButtonOnClickListener());
- }
- /////////////////////////////////////////////////////////////////////////////////////
- class MyButtonOnClickListener implements OnClickListener {
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Intent intent = new Intent();
- switch (arg0.getId()) {
- case R.id.btnRegister:
- try{
- Socket s1=new Socket(ipAdress,6666);
- OutputStream os=s1.getOutputStream();
- DataOutputStream dos=new DataOutputStream(os);
- dos.writeUTF(etxtUserName.getText().toString() + " "
- + etxtPassword.getText().toString());// 传给服务器账号和密码
- dos.close();
- s1.close();
- }catch(UnknownHostException e){
- e.printStackTrace();
- Toast.makeText(getApplicationContext(), "注册失败",
- Toast.LENGTH_SHORT).show();
- }catch(IOException e){
- e.printStackTrace();
- Toast.makeText(getApplicationContext(), "注册失败",
- Toast.LENGTH_SHORT).show();
- }
- intent.setClass(Register.this,
- LogIn.class);
- break;
- }
- Register.this.startActivity(intent);
- finish();
- }
- }
- }
Personal.java的代码内容:
- package com.example.myclient;
- import android.app.Activity;
- import android.os.Bundle;
- public class Personal extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.personal);
- }
- }
五、注意点
1、要注意该代码只适用于手机和电脑在同一局域网中,换句话说连得都是一个网,因为你的电脑没有公网IP,是不能当做真正的服务器使用的,除非你花钱买了IP
2、要记得先启动服务器程序,再运行客户端应用,否则会出问题
3、再运行之前把ip改成自己的才可以使用,要在命令行中用ipconfig命令查看
4、由于服务器程序是死循环,调试后如果没有关闭服务器程序,要记得终止其运行,否则之后再运行由于端口被占用会报错,如果在eclipse中找不到终止的方法,则可以在任务管理器的进程属性中找到其PID号停止其运行,查找PID号的方法是在命令行中输入netstat -ano,如果不理解可以自行百度
两个工程文件源码链接
http://download.youkuaiyun.com/detail/grape875499765/9289373
1835



被折叠的 条评论
为什么被折叠?



