我11月21日发表了“实现android注册登陆功能的客户端服务器源码与解析”的博客,刚刚加入了数据库,把我自己加入数据库的过程和又完善了服务器的代码分享一下


一、阅读要求

同11月21日发表博文,如果没有阅读的话建议先阅读后再阅读本博文

对数据库有基本的了解和掌握


二、实现情况

1、解决了在注册时忽然退出再次注册这种情况下,服务器端的bug

2、解决了在注册时忽然退出直接登陆这种情况下,服务器端的bug

3、加入了数据库,可以进行大量用户名和密码存储


三、操作步骤

1、同上篇博文一样的操作环境

2、搭建mysql数据库,如果不会的请自行百度,我使用的是mysql workbench 6.3CE

3、在数据库中建表,建表语句在MyServer->mysql文件夹里面

apk mysql客户端 mysql android客户端_apk mysql客户端

apk mysql客户端 mysql android客户端_服务器_02

4、运行MyServer,要注意是运行MyServer而不是运行整个工程

apk mysql客户端 mysql android客户端_数据库_03

5、安装好app,打开MyClient,然后开始进行注册登陆等操作,可以检测一下是否还存在我在第二条实现情况里面提到的bug,图片界面和上一篇博文相同

apk mysql客户端 mysql android客户端_数据库_04

apk mysql客户端 mysql android客户端_apk mysql客户端_05

apk mysql客户端 mysql android客户端_android_06


四、代码讲解

1、首先客户端和上一篇博文代码是相同的,在这里就不粘贴了,如果想看的朋友请到上一篇博文观看


2、服务器代码


话不多说,解释都在注释中


MyServer.java



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;
import java.sql.ResultSet;


public class MyServer {
	public static void main(String[] args){
		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 []getStr = dis1.readUTF().split(" ");;//用空格把账号和密码分开存储
				System.out.println(getStr[0]+" "+getStr[1]+" "+getStr[2]);//调试信息
				
				//如果发来注册的信息就做如下操作
				if(getStr[2].equals("Register")){
					System.out.println("等待下一步指令");
					Socket s2 = server.accept();
					InputStream is2 = s2.getInputStream();
					DataInputStream dis2 = new DataInputStream(is2);
					String []getStrSecond = dis2.readUTF().split(" ");//用空格把账号和密码分开存储
					//这个处理是针对有人注册没注册完就退出了程序然后另外有人开始登陆或者重新注册
					System.out.println(getStrSecond[0] + " " + getStrSecond[1]
							+ " " + getStrSecond[2]);// 调试信息
					if(getStrSecond[2].equals("Login")){
						/判断是否可以登录//
						login(s2,getStrSecond);
					}
					else if(getStrSecond[2].equals("Register")){
						//不需要处理
					}
					else if(getStrSecond[2].equals("Registered")){
						///数据库插入操作
						insertMasterDB(getStrSecond);
						///数据库插入操作
					}
					is2.close();
					s2.close();
					dis2.close();
				}
				//如果发来登录账号+密码+login做如下操作
				else if(getStr[2].equals("Login")){
					System.out.println("进入登陆判断");//调试信息
					/判断是否可以登录//
					login(s1,getStr);
					//System.out.println(getStr[0]+" "+getStr[1]+" "+getStr[2]);//调试信息
				}
				//这里是针对进入注册界面但是没有完成注册就退出且再次进入注册界面情况的处理
				else if(getStr[2].equals("Registered")){
					///数据库插入操作
					insertMasterDB(getStr);
					///数据库插入操作
				}
				dis1.close();
				s1.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}	
	}
	
	/**
	 * 该函数为是否允许用户登录函数
	 * @param s1 建立连接的socket变量
	 * @param getStr 要查找的_id和password都在里面
	 */
	public static void login(Socket s1,String []getStr){
		//如果账号和密码都对的话则返回允许登录命令
		/查找用户名和密码是否一致//
		ServerDatabase masterDB = new ServerDatabase();
		masterDB.connSQL();
		String select = "select * from userdata where _id = '" + getStr[0]
				+ "' and password = '" + getStr[1] + "';";
		ResultSet resultSet = masterDB.selectSQL(select);
		// ///查找用户名和密码是否一致//
		try {
			// 用户名和密码不一致
			if (resultSet.next() == false) {
				// 禁止登录命令
				OutputStream os=s1.getOutputStream();
				DataOutputStream dos=new DataOutputStream(os);
				dos.writeUTF("NO");
				dos.close();
				System.out.println("用户密码错误");//调试信息
			}
			// 用户名和密码一致
			else {
				// 允许登录命令
				OutputStream os=s1.getOutputStream();
				DataOutputStream dos=new DataOutputStream(os);
				dos.writeUTF("YES");
				dos.close();
				System.out.println("用户密码正确");//调试信息
			}
		} catch (Exception e) {
			System.out.println("显示出错。");
			e.printStackTrace();
		}
		masterDB.deconnSQL();// 关闭连接
	}
	
	/**
	 * 该函数为插入master数据库命令
	 * @param getStr 插入数据库的_id password都在里面
	 */
	public static void insertMasterDB(String []getStr){
		ServerDatabase masterDB = new ServerDatabase();
		masterDB.connSQL();
		String s = "select * from userdata";//调试信息
		String insert = "insert into userdata(_id,password) " +
				"values('"+getStr[0]+"','"+getStr[1]+"')";
		if (masterDB.insertSQL(insert) == true) {
			System.out.println("insert successfully");
			ResultSet resultSet = masterDB.selectSQL(s);//调试信息
			masterDB.layoutStyle2(resultSet);//调试信息
		}
		masterDB.deconnSQL();//关闭连接
	}
}


ServerDatabase.java




package com.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ServerDatabase {
	private Connection conn = null;
	private PreparedStatement statement = null;
	// connect to MySQL
	public void connSQL() {
		String urle = "jdbc:mysql://localhost:3306/masterdatabase";//port:3306 database:masterdatabase
		String username = "root";//user
		String password = "102938475610";//password
		try { 
			Class.forName("com.mysql.jdbc.Driver" );//加载驱动,连接数据库
			conn = DriverManager.getConnection(urle,username, password ); 
			}
		//捕获加载驱动程序异常
		 catch ( ClassNotFoundException cnfex ) {
			 System.err.println(
			 "装载 JDBC/ODBC 驱动程序失败。" );
			 cnfex.printStackTrace(); 
		 } 
		 //捕获连接数据库异常
		 catch ( SQLException sqlex ) {
			 System.err.println( "无法连接数据库" );
			 sqlex.printStackTrace();
		 }
	}

	// disconnect to MySQL
	public void deconnSQL() {
		try {
			if (conn != null)
				conn.close();
		} catch (Exception e) {
			System.out.println("关闭数据库问题 :");
			e.printStackTrace();
		}
	}

	// execute selection language
	public ResultSet selectSQL(String sql) {
		ResultSet rs = null;
		try {
			statement = conn.prepareStatement(sql);
			rs = statement.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return rs;
	}

	// execute insertion language
	public boolean insertSQL(String sql) {
		try {
			statement = conn.prepareStatement(sql);
			statement.executeUpdate();
			return true;
		} catch (SQLException e) {
			System.out.println("插入数据库时出错:");
			e.printStackTrace();
		} catch (Exception e) {
			System.out.println("插入时出错:");
			e.printStackTrace();
		}
		return false;
	}
	//execute delete language
	public boolean deleteSQL(String sql) {
		try {
			statement = conn.prepareStatement(sql);
			statement.executeUpdate();
			return true;
		} catch (SQLException e) {
			System.out.println("插入数据库时出错:");
			e.printStackTrace();
		} catch (Exception e) {
			System.out.println("插入时出错:");
			e.printStackTrace();
		}
		return false;
	}
	//execute update language
	public boolean updateSQL(String sql) {
		try {
			statement = conn.prepareStatement(sql);
			statement.executeUpdate();
			return true;
		} catch (SQLException e) {
			System.out.println("插入数据库时出错:");
			e.printStackTrace();
		} catch (Exception e) {
			System.out.println("插入时出错:");
			e.printStackTrace();
		}
		return false;
	}
	
	// show data in ju_users
	public void layoutStyle2(ResultSet rs) {
		System.out.println("-----------------");
		System.out.println("_id" + "\t" + "password");
		System.out.println("-----------------");
		try {
			while (rs.next()) {
				System.out.println(rs.getString("_id") + "\t"
						+ rs.getString("password") + "\n");
				//"\t" + rs.getInt("age") + "\t"+ rs.getString("work") + "\t" + rs.getString("others") +"\n");
			}
		} catch (SQLException e) {
			System.out.println("显示时数据库出错。");
			e.printStackTrace();
		} catch (Exception e) {
			System.out.println("显示出错。");
			e.printStackTrace();
		}
	}

	/*public static void main(String args[]) {

		ServerDatabase h = new ServerDatabase();
		h.connSQL();
		String select = "select * from userdata where _id="
				+ "'w'" + " and password="
				+ "'w'" + ";";
		ResultSet resultSet = h.selectSQL(select);
		h.layoutStyle2(resultSet);//调试信息
		String s = "select * from userdata";

		String insert = "insert into userdata(_id,password) " +
				"values('aaron','102938475610')";
		String update = "update userdata set password ='123456789' where _id= 'aaron'";
		String delete = "delete from userdata where _id= 'aaron'";

		if (h.insertSQL(insert) == true) {
			System.out.println("insert successfully");
			ResultSet resultSet = h.selectSQL(s);
			h.layoutStyle2(resultSet);
		}
		if (h.updateSQL(update) == true) {
			System.out.println("update successfully");
			ResultSet resultSet = h.selectSQL(s);	
			h.layoutStyle2(resultSet);
		}
		if (h.insertSQL(delete) == true) {
			System.out.println("delete successfully");
			ResultSet resultSet = h.selectSQL(s);
			h.layoutStyle2(resultSet);
		}
		h.deconnSQL();
	}*/
}




五、注意

1、在java中使用mysql前,要加入相应的jar包,在我的工程中有,但是有可能需要再次添加

apk mysql客户端 mysql android客户端_mysql_07

mysql-connector-java-5.0.5-bin.jar我使用的jar包,如果工程中没有的话,请自行查找如何添加

2、由于本人在做一个android项目,名字叫做Master,所以在服务器端会提到相关的变量,请读者不要过于在意

3、在使用前,客户端要改掉LogIn.java和Register.java的ip地址,在命令行中用ipconfig查询,服务器端请改掉username password,这两个是你在mysql中设置的用户名和密码

4、在ServerDatabase.java中有一段注释掉的main函数,这个是给读者提供update和delete函数的用法,因为在MyServer.java中并没有调用

 

静坐常思己过,闲谈莫论人非