安卓注册(服务器客户端)
做安卓开发有很多时候都是要和web交互的,我们很难制作本地应用,这次把小弟整出来的安卓和服务器通讯贡献出来,希望能帮到需要的朋友,同时也是加深印象。
我们先来搭建安卓客户端,首先写好布局文件:
1.布局文件Register.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/fuction_fond_bg" android:orientation="vertical" > <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/setting_btn" > </ImageView> <ScrollView android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="请输入您的注册信息:" android:textColor="#6495ED" android:textSize="20dip" > </TextView> <View android:layout_width="fill_parent" android:layout_height="2dip" android:background="#FF909090" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="20dip" android:background="#FFFFFF" android:orientation="vertical" android:padding="10dp" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="帐 号: " android:textColor="#6495ED" > </TextView> <EditText android:id="@+id/username" android:layout_width="190dip" android:layout_height="wrap_content" > </EditText> </LinearLayout> <View android:layout_width="fill_parent" android:layout_height="2dip" android:background="#FF909090" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密 码: " android:textColor="#6495ED" > </TextView> <EditText android:id="@+id/password" android:layout_width="190dip" android:layout_height="wrap_content" android:password="true" > </EditText> </LinearLayout> <View android:layout_width="fill_parent" android:layout_height="2dip" android:background="#FF909090" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="确认密码 : " android:textColor="#6495ED" > </TextView> <EditText android:id="@+id/confirmpsw" android:layout_width="190dip" android:layout_height="wrap_content" android:password="true" > </EditText> </LinearLayout> <View android:layout_width="fill_parent" android:layout_height="2dip" android:background="#FF909090" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="昵 称: " android:textColor="#6495ED" > </TextView> <EditText android:id="@+id/nikename" android:layout_width="190dip" android:layout_height="wrap_content" > </EditText> </LinearLayout> <View android:layout_width="fill_parent" android:layout_height="2dip" android:background="#FF909090" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="性 别: " android:textColor="#6495ED" > </TextView> <RadioGroup android:id="@+id/gender_group_rb" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <RadioButton android:id="@+id/male_rb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="男 " android:textColor="#6495ED" > </RadioButton> <RadioButton android:id="@+id/female_rb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="女" android:textColor="#6495ED" > </RadioButton> </RadioGroup> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" > </ImageView> </LinearLayout> <View android:layout_width="fill_parent" android:layout_height="2dip" android:background="#FF909090" /> <Button android:id="@+id/register_btn" android:layout_width="fill_parent" android:layout_height="40dp" android:layout_margin="10dp" android:background="@drawable/new_button_bg" android:gravity="center" android:text="注 册" /> </LinearLayout> </LinearLayout> </ScrollView> </LinearLayout>
2.Activity文件:RegisterActivity.java
为了让大家看得方便,我逐个为大家讲解:
1.初始化视图控件:
/** * 初始化视图控件 */ private void initView() { username_et = (EditText) findViewById(R.id.username); password_et = (EditText) findViewById(R.id.password); confirmpsw_et = (EditText) findViewById(R.id.confirmpsw); nikename_et = (EditText) findViewById(R.id.nikename); register_btn = (Button) findViewById(R.id.register_btn); register_btn.setOnClickListener(listener); gender_group_rb = (RadioGroup) findViewById(R.id.gender_group_rb); gender_group_rb.setOnCheckedChangeListener(checkListener); }
2.当我们填写好数据后,点击注册按钮,调用注册这个方法:
/** * 注册按钮的点击 */ private OnClickListener listener = new OnClickListener() { @Override public void onClick(View v) { doRegister(); } }; /** * 开始注册 */ private void doRegister() { pd = ProgressDialog.show(RegisterActivity.this, "正在注册..", "正在注册中..请稍后....", true, true); // 1.获取数据 username = username_et.getText().toString(); password = password_et.getText().toString(); confirmpsw = confirmpsw_et.getText().toString(); nickname = nikename_et.getText().toString(); // 2.进行校验,不对返回,否则继续 if (checkNull(username) || checkNull(password) || checkNull(confirmpsw) || checkNull(gender) || checkNull(nickname)) { Toast.makeText(this, "请填写完整数据", Toast.LENGTH_SHORT).show(); // TODO 这里本应该完整校验的,暂时偷懒 return; } // 3.开始向服务器注册 Thread thread = new Thread(registerRunnable); thread.start(); }
因为做的比较简陋,详细的表单校验没有写,点击注册开启一个子线程来处理和服务器打交道的耗时操作。在注册的过程中用的httpUrlConnection连接服务器,向服务器提交注册信息。
/** * 开始注册的线程 */ Runnable registerRunnable = new Runnable() { @Override public void run() { // 1.拼装数据 StringBuilder sb = new StringBuilder(); sb.append("<users>"); sb.append("<user>"); sb.append("<username>"); sb.append(username); sb.append("</username>"); sb.append("<password>"); sb.append(password); sb.append("</password>"); sb.append("<nickname>"); sb.append(nickname); sb.append("</nickname>"); sb.append("<gender>"); sb.append(gender); sb.append("</gender>"); sb.append("</user>"); sb.append("</users>"); // 2.开始写数据 byte content[] = sb.toString().getBytes(); try { URL url = new URL(Constant.REGISTER_SERVLET); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "mutipart/form-data"); conn.setRequestProperty("Content-Length", content.length + ""); conn.getOutputStream().write(content); // 3.获取服务器返回的数据 if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream in = conn.getInputStream(); RegisterResultTool resultTool = new RegisterResultTool(); String result = resultTool.getResultFromInputStream(in); // 4.提交结果 Message msg = new Message(); msg.obj = result; msg.what = 200; registerResultHandler.sendMessage(msg); } } catch (IOException e) { Message msg = new Message(); msg.what = 400; registerResultHandler.sendMessage(msg); e.printStackTrace(); } pd.cancel(); } };
向服务器提交数据后,服务器会返回一些结果数据,我们就需要处理这些结果数据:
/** * 处理服务器返回结果的类 * * @author Larson * */ private class RegisterResultTool { /** * 从服务器返回的数据中读取返回结果 * * @param in * @return */ public String getResultFromInputStream(InputStream in) { String result = ""; SAXParserFactory sf = SAXParserFactory.newInstance(); try { XMLReader xr = sf.newSAXParser().getXMLReader(); RegisterResultHandler rrh = new RegisterResultHandler(); xr.setContentHandler(rrh); xr.parse(new InputSource(in)); result = rrh.getResult(); } catch (Exception e) { e.printStackTrace(); } return result; } } /** * 因为服务器返回的是xml形式,所以需要解析 * * @author Larson * */ private class RegisterResultHandler extends DefaultHandler { /** * 获得的服务器返回结果 */ private String result; /** * 临时存取数据的变量 */ private String var=""; /** * 获取返回值 * * @return */ public String getResult() { return result; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); } @Override public void characters(char[] ch, int start, int length) throws SAXException { var += new String(ch, start, length); super.characters(ch, start, length); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { /** * 取出info标签的数据(服务器返回的注册结果) */ if (qName.equals("info")) { result = var.trim(); } super.endElement(uri, localName, qName); } }
获取结果后,在handler中刷新ui通知用户:
/** * 处理返回结果的handler * 如果返回的数据是服务器给的成功数据,注册成功,否则就是服务器有问题 */ private Handler registerResultHandler = new Handler() { public void handleMessage(Message msg) { System.out.println(msg.obj+"-------------"+msg.what); switch (msg.what) { case 400: Toast.makeText(RegisterActivity.this, "注册失败.", Toast.LENGTH_SHORT).show(); break; case 200: String str = (String) msg.obj; if(str.contains("regist_ok")) Toast.makeText(RegisterActivity.this, "注册成功.", Toast.LENGTH_SHORT).show(); else Toast.makeText(RegisterActivity.this, "服务器未开放.", Toast.LENGTH_SHORT).show(); break; default: break; } }; };
接下来我们来写服务器端:
服务器段用registerServlet处理客户端请求:registerServlet.java:
package com.larson.pm; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.larson.tools.RegisterResultTool; public class RegisterServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取输入输出流 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); InputStream in = request.getInputStream(); //2.处理客户端发送的数据 RegisterResultTool tool = new RegisterResultTool(); String result = tool.register(in); //3.向客户端写相应数据 out.write(result); out.flush(); out.close(); in.close(); } }
servlet拿到客户端的数据inputStream,用一个工具类RegisterResultTool.java处理这些数据:
package com.larson.tools; import java.io.InputStream; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import com.larson.bean.UserInfo; import com.larson.daoimpl.UserDao; import com.larson.handler.RegisterHandler; /** * 处理客户端发送过来数据的类 * * @author Larson * */ public class RegisterResultTool { /** * 处理客户端发送过来数据的类 * @param in * 客户端的流 * @return 处理结果 */ public String register(InputStream in) { String result = null; StringBuilder sb = new StringBuilder(); //1.获取解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); XMLReader reader= null; try { //2.自定义解析过程 reader = factory.newSAXParser().getXMLReader(); RegisterHandler handler = new RegisterHandler(); reader.setContentHandler(handler); //3.开始解析客户端过来的输入流,并把数据封装到userInfo的bean中 reader.parse(new InputSource(in)); UserInfo user = handler.getUser(); //4.往服务器的数据库添加一条用户信息 UserDao dao = new UserDao(); dao.add(user); //5.完成后给客户端反馈消息 sb.append("<info>"); sb.append("regist_ok"); sb.append("</info>"); } catch (Exception e) { //TODO 解析失败 sb.append("<info>"); sb.append("regist_fail"); sb.append("</info>"); e.printStackTrace(); } result = sb.toString(); return result; } }
再次过程中,我们需要自定义一个sax解析xml的handler对数据进行处理封装到bean文件中:
RegisterHandler.java:
package com.larson.handler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.larson.bean.UserInfo; public class RegisterHandler extends DefaultHandler { private UserInfo user; private String var=""; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //遇到user标签就表示是一个user对象 if(qName.equals("user")) user = new UserInfo(); super.startElement(uri, localName, qName, attributes); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("username".equals(qName)) user.setUsername(var); if("password".equals(qName)) user.setPassword(var); if("nickname".equals(qName)) user.setNickname(var); if("gender".equals(qName)) user.setGender(var); //设置完临时属性置空 var=""; super.endElement(uri, localName, qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { var+=new String(ch, start, length); super.characters(ch, start, length); } /** * 获取填充完属性的user对象 * @return */ public UserInfo getUser() { return user; } }
,处理完毕以后,需要把这些数据写入到数据库,生成一条新的用户信息记录,因此需要些一个UserDao。,而我们习惯性用jdbcutils管理连接,这里为了代码可重用更好,我把所有修改的方法集合到一个update方法里面:JdbcUtils.java:
package com.larson.tools; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import com.larson.handler.ResultSetHandler; /** * 数据库相关 * @author Larson * */ public class JdbcUtils { // private static ComboPooledDataSource ds = null; private static Connection conn; static{ try{ InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); properties.load(in); String url = properties.getProperty("url"); String user = properties.getProperty("user"); String passwd = properties.getProperty("password"); String driver = properties.getProperty("driver"); Class.forName(driver); conn = DriverManager.getConnection(url, user, passwd); // ds = new ComboPooledDataSource(); // ds.setDriverClass(driver); // ds.setJdbcUrl(url); // ds.setUser(user); // ds.setPassword(passwd); // // ds.setInitialPoolSize(10); // ds.setMinPoolSize(5); // ds.setMaxPoolSize(20); // // ds = new ComboPooledDataSource(); }catch (Exception e) { throw new ExceptionInInitializerError(e); } } /** * 获取连接 * @return * @throws SQLException */ public static Connection getConnection() throws SQLException{ // return ds.getConnection(); return conn; } /** * 释放连接 * @param conn * @param st * @param rs */ public static void release(Connection conn,Statement st,ResultSet rs){ if(rs!=null){ try{ rs.close(); }catch (Exception e) { e.printStackTrace(); } rs = null; } if(st!=null){ try{ st.close(); }catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try{ conn.close(); }catch (Exception e) { e.printStackTrace(); } } } /** * 替换dao中的增删改方法 * @param sql * @param params * @throws SQLException */ public static void update(String sql,Object params[]) throws SQLException{ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = getConnection(); st = conn.prepareStatement(sql); for(int i=0;i<params.length;i++){ st.setObject(i+1, params[i]); } st.executeUpdate(); }finally{ release(conn, st, rs); } } /** * 替换所有dao中的查询 策略模式 * @param sql * @param params * @param rsh * @return * @throws SQLException */ public static Object query(String sql,Object params[],ResultSetHandler rsh) throws SQLException{ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = getConnection(); st = conn.prepareStatement(sql); for(int i=0;i<params.length;i++){ st.setObject(i+1, params[i]); } rs = st.executeQuery(); return rsh.handler(rs); }finally{ release(conn, st, rs); } } }
然后便是UserDao.java:
package com.larson.daoimpl; import com.larson.bean.UserInfo; import com.larson.exception.DaoException; import com.larson.handler.BeanHandler; import com.larson.tools.JdbcUtils; public class UserDao { public void add(UserInfo user) { try { String sql = "insert into user(username,password,gender,nickname) values(?,?,?,?)"; Object params[] = { user.getUsername(), user.getPassword(), user.getGender(),user.getNickname() }; for(Object obj:params) System.out.println("userdao add---"+obj); JdbcUtils.update(sql, params); } catch (Exception e) { throw new DaoException(e); } } public void update(UserInfo user) { try { String sql = "update user set user=?,password=?,gender=?,nickname=? where id=?"; Object params[] = { user.getId(), user.getUsername(), user.getPassword(), user.getNickname(), user.getId() }; JdbcUtils.update(sql, params); } catch (Exception e) { throw new DaoException(e); } } public void delete(String id) { try { String sql = "delete from user where id=?"; Object params[] = { id }; JdbcUtils.update(sql, params); } catch (Exception e) { throw new DaoException(e); } } public UserInfo find(String id) { try { String sql = "select * from user where id=?"; Object params[] = { id }; return (UserInfo) JdbcUtils.query(sql, params, new BeanHandler( UserInfo.class)); } catch (Exception e) { throw new DaoException(e); } } }
为了方便,我把bean文件也贴出来:
userInfo.java:
package com.larson.bean; public class UserInfo { private int id; private String username; private String password; private String gender; private String nickname; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } }
本来准备用数据库连接池的,可是老是报错,就是上面注释的那几行,有懂的人麻烦告诉我,感激不尽。
相关推荐
在Android应用开发中,用户身份验证是至关重要的环节,它涉及到客户端与服务器端的交互,确保用户的安全登录和注册。本示例项目“android登陆注册客户端与服务器端程序”提供了一个完整的解决方案,覆盖了从客户端...
《易语言易安卓服务器客户端测试》 在信息技术领域,服务器与客户端之间的通信是核心部分,尤其是在进行远程数据交互时。本项目"易语言易安卓服务器客户端测试.e"为我们提供了一个用易语言和易安卓实现这一功能的...
本示例提供的"android 安卓代码服务器客户端+服务器示例"是一个完整的解决方案,旨在帮助开发者学习如何在Android应用中实现与服务器的交互。以下是这个示例中包含的关键知识点: 1. **网络编程基础**: - Android...
总的来说,"Android Socket服务器客户端编程"是一个涵盖网络基础、多线程编程和Android特定挑战的主题。通过`MultiThreadServer`和`MultiThreadClient`这两个项目,开发者可以学习到如何在Android平台上构建可靠且...
这是一个简单的android登陆注册demo,包括客户端和服务器端的全部代码,还有一个闪屏界面+新手引导页,整套代码经过测试通过实现从android客户端注册到登陆;数据库采用mysql,自己是通过tomcat模拟远程调用服务器...
最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json。要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台、传输数据格式...
android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信
在IT行业中,客户端-服务器交互是应用程序开发的核心部分,特别是在移动应用开发中,例如Android客户端。本示例探讨了如何实现Android客户端与基于Struts、Hibernate和Spring的后台服务器之间的数据交互,使用JSON...
- `加入数据库mysql实现android注册登陆功能的客户端服务器源码与解析.zip`文件包含了完整的源代码,包括服务器端和Android客户端的代码,通过阅读和分析这些代码,你可以深入理解整个系统的实现细节。 通过以上...
2. **客户端**:Android客户端是用户与应用交互的界面,需要实现注册、登录、聊天、好友管理等功能。这涉及到Android的UI设计、事件监听、网络请求(如使用Retrofit或Volley库)、JSON解析(如Gson库)以及数据存储...
这个案例是一个基础的Android服务器+客户端通信实践,实际项目中可能会更复杂,涉及到更多如登录验证、数据缓存、数据同步策略等高级话题。通过不断学习和实践,你可以掌握更复杂的Android网络编程技巧。
android登陆注册客户端与服务器端程序(mysql.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
《Android 口袋微博服务器客户端代码详解》 在Android应用开发中,理解并掌握服务器客户端交互是至关重要的技能。本文将深入探讨一个名为"口袋微博"的Android项目的服务器客户端代码,帮助开发者提升对Android源码...
实现了java服务器与客户端的通信,此段代码也可用于android客户端与服务器通信。
在安卓开发中,服务器与客户端的交互是移动应用不可或缺的一部分,尤其在实现数据存储和同步功能时。"安卓服务器与客户端demo"是一个很好的学习资源,它涵盖了基础的服务器搭建、客户端连接以及数据库交互的关键知识...
《基于Android的无线点餐系统:服务器、客户端与数据库详解》 在当今信息化时代,餐饮行业的智能化已经成为一种趋势。基于Android的无线点餐系统便是这种趋势的体现,它集成了服务器、客户端和数据库三大核心模块,...
这个"android登陆与注册客户端和服务器端源码(包含数据库)"的项目为开发者提供了一个完整的解决方案,涵盖了从客户端UI到服务器端接口以及数据库设计的全过程。下面我们将详细探讨其中涉及的关键知识点。 1. **...
这篇文档将深入解析《安卓Android源码——口袋微博服务器客户端代码》的相关知识点,主要围绕安卓应用开发、源码分析以及服务器客户端交互等方面进行探讨。在Android平台上开发应用程序,理解源码是提升技能的关键,...
android登陆注册客户端与服务器端程序对应的sql文件,直接导入到MySql中既可以和以上程序组成一个完整的系统
在Android订餐客户端与服务器端的系统开发中,涉及到多个关键知识点,涵盖了移动应用开发、后端服务构建、网络通信以及数据库管理等多个方面。以下是对这些核心概念的详细阐述: 1. **Android客户端开发**:Android...