一口气看完一个项目源码(一)之用户注册
今天咋们看的这个项目源码是一个微博客户端,和服务端通讯用socket写的,项目名称:口袋微博,和前面那个项目不同,这个项目略难一点,不过没关系,让我们一起来学习学习吧。
按照使用流程,首先是注册页面,因此我们来写注册页面,先把注册页面的布局写了:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:gravity="center_horizontal" android:background="@drawable/back" android:paddingTop="25px" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- 声明一个线性布局 --> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <!-- 声明一个显示昵称的线性布局 --> <TextView android:text="@string/tvName" android:layout_width="100px" style="@style/text" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> <EditText android:id="@+id/etName" android:singleLine="true" android:layout_width="160px" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <!-- 声明显示密码的线性布局 --> <TextView android:text="@string/tvPwd" style="@style/text" android:layout_width="100px" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> <EditText android:id="@+id/etPwd1" android:singleLine="true" android:password="true" android:layout_width="160px" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <!-- 声明显示确认密码的线性布局 --> <TextView android:text="@string/tvPwd2" style="@style/text" android:layout_width="100px" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> <!-- 声明TextView控件 --> <EditText android:id="@+id/etPwd2" android:singleLine="true" android:password="true" android:layout_width="160px" android:layout_height="wrap_content" /> <!-- 声明输入确认密码EditText控件 --> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <!-- 声明包含Email输入的线性布局 --> <TextView android:text="@string/tvEmail" style="@style/text" android:layout_width="100px" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> <EditText android:id="@+id/etEmail" android:singleLine="true" android:layout_width="160px" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <!-- 声明包含心情输入的线性布局 --> <TextView android:text="@string/tvStatus" style="@style/text" android:layout_width="100px" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> <EditText android:id="@+id/etStatus" android:singleLine="true" android:text="@string/etStatus" android:layout_width="160px" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <Button android:id="@+id/btnReg" style="@style/button" android:layout_width="120px" android:layout_height="wrap_content" android:text="@string/btnReg" /> <Button android:id="@+id/btnBack" style="@style/button" android:layout_width="120px" android:layout_height="wrap_content" android:text="@string/btnBack" /> </LinearLayout> <LinearLayout android:orientation="vertical" android:visibility="visible" android:id="@+id/regResult" android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:text="@string/regSuccess" style="@style/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:id="@+id/etUno" android:layout_width="wrap_content" android:layout_height="wrap_content" android:cursorVisible="false" /> </LinearLayout> <Button android:id="@+id/btnEnter" style="@style/text" android:layout_gravity="right" android:text="@string/btnEnter" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
布局写好以后,我们需要给这些布局添加点击事件(主要是注册),通过自定义一个MyConnection指定地址和端口号连接socket得到DataOutputStream和一个DataInputStream,把要发送的注册信息封装好(这里封装用的是消息头+分隔符的形式)把消息发给服务端,然后通过DataInputStream读取服务端返回的结果,如果服务端返回结果的请求头为<#REG_SUCCESS#>代表注册成功,同时用一个变量记住返回的结果,否则就是注册失败。
注册代码如下:
/** * 方法:连接服务器,进行注册 */ public void register(){ new Thread(){ public void run(){ Looper.prepare(); //1.获得用户输入的数据并进行验证 EditText etName = (EditText)findViewById(R.id.etName); //获得昵称EditText对象 EditText etPwd1 = (EditText)findViewById(R.id.etPwd1); //获得密码EditText对象 EditText etPwd2 = (EditText)findViewById(R.id.etPwd2); //获得确认密码EditText对象 EditText etEmail = (EditText)findViewById(R.id.etEmail); //获得邮箱EditText对象 EditText etStatus = (EditText)findViewById(R.id.etStatus); //获得心情EditText对象 String name = etName.getEditableText().toString().trim(); //获得昵称 String pwd1 = etPwd1.getEditableText().toString().trim(); //获得密码 String pwd2 = etPwd2.getEditableText().toString().trim(); //获得确认密码 String email = etEmail.getEditableText().toString().trim(); //获得邮箱 String status = etStatus.getEditableText().toString().trim(); //获得状态 if(name.equals("") || pwd1.equals("") || pwd2.equals("") || email.equals("") || status.equals("")){ Toast.makeText(RegActivity.this, "请将注册信息填写完整", Toast.LENGTH_LONG).show(); return; } if(!pwd1.equals(pwd2)){ //判断两次输入的密码是否一致 Toast.makeText(RegActivity.this, "两次输入的密码不一致!", Toast.LENGTH_LONG).show(); return; } //2.连接服务器开始传数据 try{ mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT); String regInfo = "<#REGISTER#>"+name+"|"+pwd1+"|"+email+"|"+status; mc.dout.writeUTF(regInfo); String result = mc.din.readUTF(); pd.dismiss(); if(result.startsWith("<#REG_SUCCESS#>")){ //返回信息为注册成功 result= result.substring(15); //去掉信息头 uno = result; //记录用户的ID myHandler.sendEmptyMessage(0); //发出Handler消息 Toast.makeText(RegActivity.this, "注册成功!", Toast.LENGTH_LONG).show(); } else{ //注册失败 Toast.makeText(RegActivity.this, "注册失败!请重试!", Toast.LENGTH_LONG).show(); } } catch(Exception e){ e.printStackTrace(); } } }.start(); }
接下来我们来写服务端的代码,因为服务端用的socket,因此需要一个入口函数,这个入口在Server.java文件中,通过它开启一个服务线程:
public class Server{ public static void main(String args[]){ try{ ServerSocket ss = new ServerSocket(8888); ServerThread st = new ServerThread(ss); st.start(); System.out.println("Listening..."); }catch(Exception e){ e.printStackTrace(); } } }
我们转到这个线程类里面,发现实现是通过调用serverSocket的accept()方法,监听客户端请求。对于请求过来的数据,专门写一个代理类ServerAgent.java来处理。
package wpf; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; public class ServerThread extends Thread{ public ServerSocket ss; //声明ServerSocket对象 public boolean flag = false; public ServerThread(ServerSocket ss){ //构造器 this.ss = ss; flag = true; } public void run(){ while(flag){ try{ Socket socket = ss.accept(); ServerAgent sa = new ServerAgent(socket); sa.start(); } catch(SocketException se){ try{ ss.close(); ss = null; System.out.println("ServerSocket closed"); }catch(Exception ee){ ee.printStackTrace(); } } catch(Exception e){ e.printStackTrace(); } } } }
我们来看ServerAgent是怎么实现的。
代理线程通过构造函数拿到数据输入和输出流,然后在run方法里面处理用户请求。接下来就是对请求头的判断,我们这里先只讲注册请求,收到的是注册请求,解析用户发过来的数据,然后通过写一个数据库工具类DBUtil类处理用户发送过来的数据。并将处理结果返回给客户端,然后客户端通过判断从服务器获取的请求结果更新ui界面。两个主要的方法:
public ServerAgent(Socket socket){ this.socket = socket; try { this.din = new DataInputStream(socket.getInputStream()); this.dout = new DataOutputStream(socket.getOutputStream()); flag =true; } catch (IOException e) { e.printStackTrace(); } } public void run(){ while(flag){ try { String msg = din.readUTF(); //接收客户端发来的消息 // System.out.println("收到的消息是:"+msg); if(msg.startsWith("<#REGISTER#>")){ //消息为用户注册 msg = msg.substring(12); //获得字符串值 String [] sa = msg.split("\\|"); //切割字符串 String regResult = DBUtil.registerUser(sa[0], sa[1], sa[2], sa[3], "1"); if(regResult.equals(REGISTER_FAIL)){ //注册失败 dout.writeUTF("<#REG_FAIL#>"); } else{ dout.writeUTF("<#REG_SUCCESS#>"+regResult); } } }
于是,我们转到DbUtil类里面,看书怎么保存到数据库中的。我们发现存储使用一般存储方式,只是里面有设置存储编码方式,还用到了prepareStatement。处理结束返回处理结果,如果连接为null返回连接失败,如果保存到数据库成功就返回注册完的用户id,否则返回注册失败。完了之后不要忘了释放资源。
//方法:注册用户
public static String registerUser(String u_name,String u_pwd,String u_email,String u_state,String h_id){ String result=null; Connection con = null; //声明数据库连接对象 PreparedStatement ps = null; //声明语句对象 try{ con = getConnection(); if(con == null){ //判断是否成功获取连接 result = CONNECTION_OUT; return result; //返回方法的执行 } ps = con.prepareStatement("insert into user(u_no,u_name,u_pwd,u_email,u_state,h_id)" + "values(?,?,?,?,?,?)"); //构建SQL语句 String u_no = String.valueOf(getMax(USER)); //获得分配给用户的帐号 u_name = new String(u_name.getBytes(),"ISO-8859-1"); //转成ISO-8859-1以插入数据库 u_state = new String(u_state.getBytes(),"ISO-8859-1"); //转成ISO-8859-1以插入数据库 int no = Integer.valueOf(u_no); int hid = Integer.valueOf(h_id); ps.setInt(1, no); //设置PreparedStatement的参数 ps.setString(2, u_name); ps.setString(3, u_pwd); ps.setString(4, u_email); ps.setString(5, u_state); ps.setInt(6,hid); int count = ps.executeUpdate(); //执行插入 if(count == 1){ //如果插入成功 result = u_no; //获得玩家的帐号 } else{ //如果没有插入数据 result = REGISTER_FAIL; //获得出错信息 } }catch(Exception e){ e.printStackTrace(); } finally{ try{ if(ps != null){ ps.close(); ps = null; } }catch(Exception e){ e.printStackTrace(); } try{ if(con != null){ con.close(); con = null; } }catch(Exception e){ e.printStackTrace(); } } return result; }
接下来便是客户端处理服务端返回数据:
客户端处理完服务端发过来的数据,就通过handler更新界面,让进入个人中心这个按钮可见,同时拿到用户id转到个人中心页面。这样,一个用户注册的模块写好了。
Handler myHandler = new Handler(){ @Override public void handleMessage(Message msg) { switch(msg.what){ case 0: View linearLayout = (LinearLayout)findViewById(R.id.regResult); //获得线性布局 linearLayout.setVisibility(View.VISIBLE); //设置可见性 EditText etUno = (EditText)findViewById(R.id.etUno); etUno.setText(uno); break; } super.handleMessage(msg); } };
下一篇介绍用户登录时如何实现的。
相关推荐
【标题】:“新浪微博项目源码”这一主题涉及的是一个基于新浪微博API实现的项目,很可能是用某种编程语言(如Java、Python或Android)编写的。这个项目可能包含了用户登录、发送微博、查看时间线、评论互动等核心...
综上所述,"仿微博HTML源码"是一个综合性的前端项目,涉及到HTML5、CSS3和JavaScript等多个技术领域,旨在通过静态HTML页面模拟微博的用户界面和交互体验,同时还需要考虑网页的美观性和响应式设计,以适应不同设备...
系统主要包括首页、个人中心、学生管理、教师管理、分享信息管理、分享类型管理、学习资料管理、资料类型管理、作业信息管理、作业类型管理、提交信息管理、校园论坛、系统管理等功能,以及后台数据库管理。...
这是一份关于新浪微博Android客户端的源代码,它为开发者提供了一个深入理解Android应用开发,尤其是社交网络应用开发的宝贵资料。通过研究这份源码,开发者可以学习到如何在Android平台上构建一个功能丰富的、交互...
易语言源码易语言点点微博注册源码.rar 易语言源码易语言点点微博注册源码.rar 易语言源码易语言点点微博注册源码.rar 易语言源码易语言点点微博注册源码.rar 易语言源码易语言点点微博注册源码.rar 易语言源码...
本文将围绕“微博开发源码”这一主题,结合“新浪微博”的开发实例,深入探讨相关技术知识,旨在帮助读者理解和掌握微博平台的构建原理。 首先,我们要明确的是,“微博开发”不仅涉及前端用户界面的设计,还包括...
微博源码代码是一个用于构建简单微博系统的源代码集合,它实现了基本的微博发布、查看、评论和分享等功能。这个源码对于学习社交网络平台的开发流程、数据存储以及用户交互设计具有很高的参考价值。下面我们将深入...
这是一个非常灵活的博客平台,强大的网络虚拟功能。可以用作小型企业沟通。你也可以分享拍摄的照片。你可以每天更新文字,与朋友交流沟通。也可以记录日常安排。更强的功能可能要你去设计开发。调试代码时候可能会...
4. 使用说明.txt:这是一个文档,详细解释了如何使用这套源码,对于理解和部署源码非常关键。 5. crossdomain.xml:这是一个跨域策略文件,允许不同源的请求访问,这对于站外调用微博视频是非常必要的。 6. ckplayer...
综合这些文件,我们可以推断这份源码使用Java语言开发,依赖于Apache的开源组件,以构建一个功能全面、跨平台的微博应用。开发者可能利用HttpClient进行网络通信,通过Commons Logging进行日志记录,同时使用Codec库...
"微博源码(asp+access)" 提供了一个基于ASP(Active Server Pages)脚本语言和Access数据库构建的微型博客系统的源代码。这个系统可能类似于知名的微博服务,允许用户发布短消息,分享观点,与他人互动。 【描述...
本文将深入探讨一个基于PHP开发的项目——XWeibo,这是一款旨在模仿中国知名社交媒体平台新浪微博的程序。通过分析XWeibo的源码,我们可以学习到PHP开发的一些关键技术和实践。 1. **PHP基础应用** XWeibo的实现离...
【标题】"微博系统 源码"所指的是一个基于ASP(Active Server Pages)技术开发的微博应用的完整源代码。ASP是一种微软公司推出的服务器端脚本环境,它允许开发者创建动态网页并处理用户交互。这个微博系统源码提供了一...
该系统是由睿思创新(北京)科技有限公司推出的一套智能化微博系统,目前为止是IT...俏微博基础架构采用世界上最流行的 web 编程组合 PHP+MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效微博系统解决方案。
这个应用展示了如何在Android系统上实现一个功能完备的社交网络应用,包括用户登录、信息推送、动态发布、评论互动等核心功能。 一、Android基础架构 源码中涵盖了Android四大组件(Activity、Service、...
腾讯微博客户端源码是一个宝贵的学习资源,特别是对于那些想要深入理解客户端应用开发的开发者来说。这个源码提供了关于如何构建一个完整的社交网络客户端的详细实现,涵盖了从用户界面设计到网络通信、数据管理等多...
总结,通过分析“新浪微博 iOS版”的源码,我们可以深入了解iOS应用的开发流程,包括UI设计、网络通信、数据存储、性能优化等多个方面。这不仅有助于提升个人的iOS开发技能,也对理解大型社交应用的架构设计有着重要...
仿新浪微博的网站源码 此网站花费了8个月的时间开发的,界面UI完全用旧版微博的CSS和图片,前台用jquery,后台由Asp.net MVC3+纯ADO.Net 开发。运行的话, 数据库文件在DB_51Aspx下,附加即可(MS Sql2008),并...
这个项目源码提供了一个基础的微博应用实例,它涵盖了Android开发中的多个核心概念和技术,对于初学者和进阶开发者都是一个很好的学习资源。 首先,我们需要了解Android应用程序的基本结构。一个Android应用通常由...
【简易微博源码】是一个基于互联网社交媒体平台的开发项目,主要目标是实现一个基础的微博功能,让用户可以发布、查看和分享简短的信息,类似于微型博客。在这个源码中,我们可以学习到关于Web开发的基本技术和架构...