`
zhonglunshun
  • 浏览: 139550 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一口气看完一个微博源码(一)

阅读更多

一口气看完一个项目源码(一)之用户注册

今天咋们看的这个项目源码是一个微博客户端,和服务端通讯用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);
       }
    };

 下一篇介绍用户登录时如何实现的。

0
0
分享到:
评论

相关推荐

    新浪微博项目源码

    【标题】:“新浪微博项目源码”这一主题涉及的是一个基于新浪微博API实现的项目,很可能是用某种编程语言(如Java、Python或Android)编写的。这个项目可能包含了用户登录、发送微博、查看时间线、评论互动等核心...

    仿微博HTML源码

    综上所述,"仿微博HTML源码"是一个综合性的前端项目,涉及到HTML5、CSS3和JavaScript等多个技术领域,旨在通过静态HTML页面模拟微博的用户界面和交互体验,同时还需要考虑网页的美观性和响应式设计,以适应不同设备...

    新浪微博Android客户端源码

    这是一份关于新浪微博Android客户端的源代码,它为开发者提供了一个深入理解Android应用开发,尤其是社交网络应用开发的宝贵资料。通过研究这份源码,开发者可以学习到如何在Android平台上构建一个功能丰富的、交互...

    易语言源码易语言点点微博注册源码.rar

    易语言源码易语言点点微博注册源码.rar 易语言源码易语言点点微博注册源码.rar 易语言源码易语言点点微博注册源码.rar 易语言源码易语言点点微博注册源码.rar 易语言源码易语言点点微博注册源码.rar 易语言源码...

    微博开发源码新浪微博

    本文将围绕“微博开发源码”这一主题,结合“新浪微博”的开发实例,深入探讨相关技术知识,旨在帮助读者理解和掌握微博平台的构建原理。 首先,我们要明确的是,“微博开发”不仅涉及前端用户界面的设计,还包括...

    无名个人微博系统(MicroBlog)源码.zip

    无名轻博客博是一款基于PHP和Sqlite平台的简单易用的个人微博系统(MicroBlog)。致力于为您提供快速、稳定,且在使用上又极其简单、舒适的微博服务。 使用前请修改密码,默认密码:admin 配置文件:app/class/config....

    微博 源码

    【标题】:“微博源码”通常指的是某个微博应用的源代码,这可能是一个移动平台上的应用,如Android或iOS。源码是程序的基础,包含了所有编程逻辑和功能实现的细节。 【描述】:“微博源码”这个描述简洁,暗示了...

    微博视频无水印解析源码.rar

    《微博视频无水印解析源码详解》 在数字化时代,社交媒体平台如微博已经成为人们...易语言提供的源码为我们提供了一个了解和学习这一过程的窗口,但同时也提醒我们在享受技术便利的同时,要遵守互联网伦理和法律法规。

    微博源码代码

    微博源码代码是一个用于构建简单微博系统的源代码集合,它实现了基本的微博发布、查看、评论和分享等功能。这个源码对于学习社交网络平台的开发流程、数据存储以及用户交互设计具有很高的参考价值。下面我们将深入...

    新浪微博视频解析源码 秒拍视频站外调用源码.rar_instrumenttqi_runbv3_微博视频swf_微博视频分析_调用

    4. 使用说明.txt:这是一个文档,详细解释了如何使用这套源码,对于理解和部署源码非常关键。 5. crossdomain.xml:这是一个跨域策略文件,允许不同源的请求访问,这对于站外调用微博视频是非常必要的。 6. ckplayer...

    史上最全功能微博源码附件

    综合这些文件,我们可以推断这份源码使用Java语言开发,依赖于Apache的开源组件,以构建一个功能全面、跨平台的微博应用。开发者可能利用HttpClient进行网络通信,通过Commons Logging进行日志记录,同时使用Codec库...

    微博源码(asp+access)

    "微博源码(asp+access)" 提供了一个基于ASP(Active Server Pages)脚本语言和Access数据库构建的微型博客系统的源代码。这个系统可能类似于知名的微博服务,允许用户发布短消息,分享观点,与他人互动。 【描述...

    仿新浪微博php程序xweibo

    本文将深入探讨一个基于PHP开发的项目——XWeibo,这是一款旨在模仿中国知名社交媒体平台新浪微博的程序。通过分析XWeibo的源码,我们可以学习到PHP开发的一些关键技术和实践。 1. **PHP基础应用** XWeibo的实现离...

    腾讯微博客户端源码

    【腾讯微博客户端源码】是一个面向Android平台的应用程序开发项目,它提供了全面的功能,与腾讯微博服务进行交互。源码的可用性使得开发者能够深入理解微博客户端的内部工作原理,学习如何实现各种社交网络功能,...

    基于机器学习的微博情感分析微博源码+项目说明.zip

    基于机器学习的微博情感分析微博源码+项目说明.zip基于机器学习的微博情感分析微博源码+项目说明.zip基于机器学习的微博情感分析微博源码+项目说明.zip基于机器学习的微博情感分析微博源码+项目说明.zip基于机器学习...

    微博系统 源码

    【标题】"微博系统 源码"所指的是一个基于ASP(Active Server Pages)技术开发的微博应用的完整源代码。ASP是一种微软公司推出的服务器端脚本环境,它允许开发者创建动态网页并处理用户交互。这个微博系统源码提供了一...

    基于PHP的微博系统源码

    该系统是由睿思创新(北京)科技有限公司推出的一套智能化微博系统,目前为止是IT...俏微博基础架构采用世界上最流行的 web 编程组合 PHP+MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效微博系统解决方案。

    新浪微博 IOS版源码

    总结,通过分析“新浪微博 iOS版”的源码,我们可以深入了解iOS应用的开发流程,包括UI设计、网络通信、数据存储、性能优化等多个方面。这不仅有助于提升个人的iOS开发技能,也对理解大型社交应用的架构设计有着重要...

    仿新浪微博源码

    仿新浪微博的网站源码 此网站花费了8个月的时间开发的,界面UI完全用旧版微博的CSS和图片,前台用jquery,后台由Asp.net MVC3+纯ADO.Net 开发。运行的话, 数据库文件在DB_51Aspx下,附加即可(MS Sql2008),并...

    新浪微博源码

    【新浪微博源码】是一个关于构建类似新浪微博应用的代码实现,其中包含了多个关键技术和组件的运用。这个源码项目旨在提供一个学习和参考的平台,帮助开发者深入理解Android应用开发中的某些特定功能和交互设计。 ...

Global site tag (gtag.js) - Google Analytics