安卓注册服务器代码,android 仿微信demo——注册功能实现(服务端)

服务端注册功能实现

通过web层完成客户端和服务端的数据交互(接受数据,发送数据),service层完成业务逻辑(注册,登录),dao层操作数据库(要借助工具类)

创建项目

idea创建服务端项目

d06977f5c43e68b2a32c93cfce85e6fa.png

120a748ebaacb719182cba2dbf8f9b04.png

a233c19a6e775e0e7c3539f3b8104ec4.png

配置tomcat服务器

75d87fb60887257b72aa8df615692529.png

54837a95147002cab22b5c917d571cca.png

启动项目测试服务器

4391cc0ac290f18c78215bafe63d71cc.png

c85b4ed2503a131af0a48beb45aed6b0.png

ce54499edfaf586f08cc42b8d7277059.png

创建web层和客户端完成数据交互

创建Servlet Reigister.java

d8c5026f00490c2076b372fb75d1e95b.png

f9f3f47618a3c67cd81329e5288f98f7.png

Reigister.java

package com.example.controller;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

import com.example.pojo.User;

import com.example.service.UserService;

import com.example.service.UserServiceImpl;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.annotation.*;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.URLDecoder;

@WebServlet(name = "Reiister", value = "/Reigister")

public class Reigister extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doPost(request, response);

}

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

/* 设置中文字符编码,防止乱码*/

request.setCharacterEncoding("utf-8");

response.setCharacterEncoding("UTF-8");

//以json数据完成操作

response.setContentType("application/json;charset=UTF-8");

System.out.println(request.getContentType());// 得到客户端发送过来内容的类型,application/json;charset=UTF-8

System.out.println(request.getRemoteAddr());// 得到客户端的ip地址,

BufferedReader br = new BufferedReader(new InputStreamReader(// 使用字符流读取客户端发过来的数据

request.getInputStream()));

String line = null;

StringBuffer s = new StringBuffer();//StringBuffer String的区别,如果要对数据作频繁的修改,則用StringBuffer

// 以一行的形式读取数据

while ((line = br.readLine()) != null) {

s.append(line);

}

// 关闭io流

br.close();

System.out.println(s.toString());

//JSON:这是json解析包,idea是没有的,要我们自己导入

User user = JSON.parseObject(s.toString(), User.class);//是用了发射机制來完成对象的封闭

//以utf-8解码操作

String number = URLDecoder.decode(user.getNumber(), "utf-8");

String name = URLDecoder.decode(user.getName(), "utf-8");

String phone = URLDecoder.decode(user.getPhone(), "utf-8");

String password = URLDecoder.decode(user.getPassword(), "utf-8");

System.out.println("用户名是:" + name + ", 密码;" + password);

System.out.println(user);

// 去数据库完成用户注册功能

UserService us = new UserServiceImpl();

//调用注册的方法

int i = us.reigisterUser(number, name, phone, password);

boolean rs = false;

//判断是否注册成功

if (i > 0) {

System.out.println("注册成功");

rs = true;

}

//将结果返回给客户端,將结果构建成json数据返回給客戶端

JSONObject rjson = new JSONObject();

rjson.put("json", rs);

response.getOutputStream().write(

rjson.toString().getBytes("UTF-8"));// 向客户端发送一个带有json对象内容的响应

}

}

上面代码用到用户实体类User和json(对数据进行封装),后面我们会介绍如何创建和使用,其他的就不阐述了,代码都有注释

在创建实体类之前,先创建一个包单独存放实体类,因为后面我们在完善功能的过程中会创建很多实体类,方便管理

d8cbad19ce780eef46d1274cb9f68624.png

074d30bc1a759463da07343515665ab7.png

User.java

package com.example.pojo;

public class User {

private int id;

private String number;

private String name;

private String password;

private String phone;

private String remark;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getNumber() {

return number;

}

public void setNumber(String number) {

this.number = number;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

public String getRemark() {

return remark;

}

public void setRemark(String remark) {

this.remark = remark;

}

@Override

public String toString() {

return "User{" +

"id=" + id +

", number='" + number + '\'' +

", name='" + name + '\'' +

", password='" + password + '\'' +

", phone='" + phone + '\'' +

", remark='" + remark + '\'' +

'}';

}

}

在WEB-INF目录下创建lib资源库,把下载好的JSON包复制到lib目录下,并把jar包添加到类库

2f194ce5b80a8b4057523a69add1f109.png

9c4147802129291a67ae8a4b078cad75.png

bc0cfa21fd39a18eeb32b71e9f5bfce4.png

44a88c5a98a9d663ff7ef631208a805e.png

创建service层处理业务逻辑功能

微信的除了注册业务逻辑处理功能,还有后面的要完善的登录,以及微信消息,通讯录,聊天信息等等,所以我们要用到一种编程思想,面向接口编程思想。创建一个接口,然后可以在里面添加我们需要业务处理的抽象方法(目前只有登录),之后在接口的实现类重写接口方法执行具体的操作即可

在上面创建Servlet Reigister.java文件中报红的地方按alt+enter键创建接口,并放到单独的包里

43633b7980286a936deaf199d2f3fd2a.png

8bafae61546ddfbde303503607cc8fb1.png

创建接口的实现类

b6a0db9a9d459e67781472509dc3c280.png

07f5c38e08a57a56e511da14cbe2b12d.png

在接口里写个注册的抽象方法

d7ab57dcc6b6ae629fafa6ad16021d60.png

在实现类中重写接口方法

c31e4d927e73da66e08c31d5e7522e38.png

add85fff5bf0cf86fb4d38be3caa67bb.png

在实现类UserServiceImpl.java中修改代码

UserServiceImpl.java

package com.example.service;

public class UserServiceImpl implements UserService {

UserDao ud = new UserDaoImpl();

@Override

public int reigisterUser(String number, String name, String phone, String password) {

int i = ud.insertUser(number, name, phone, password);

return i;

}

}

创建dao层操作数据库

方法和创建service层一样,文字就不叙述了,直接上图

1c5addd6030df6daf0a3ba55fafecee6.png

d04fcc67a01a97a86bf4dcec2f86f0f7.png

1c696db67b7ffefd9f289a15de8e416b.png

2487067cd9fdde2f51fe4bbf431e69ff.png

a19b3175ffd31c089be34692a8e5820d.png

5e3eba7036f04e542ee8d000f7435058.png

7d8e8aedfd5960942ddbd8e08889392c.png

在实现类UserDaoImpl.java中修改代码

UserDaoImpl.java

package com.example.dao;

public class UserDaoImpl implements UserDao {

@Override

public int insertUser(String number, String name, String phone, String password) {

String sql = "insert into user (number, name, phone, password, remark) values(?,?,?,?,?);";

//i如果操作成功,就是操作成功的条数

int i = JDBCUtil.executeUpdate(sql, number, name, phone, password, "1");

System.out.println("数据库的条数:");

return i;

}

}

通过JDBC工具类访问数据库

先创建包单独存放工具类,后再创建工具类JDBCUtil.java

369c760cc32cf53f76008eb929695dc9.png

JDBCUtil.java

package com.example.util;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

public class JDBCUtil {

private static final String DRIVER = "com.mysql.jdbc.Driver";

private static final String URL = "jdbc:mysql://127.0.0.1:3306/androiddb1?useUnicode=true&characterEncoding=utf-8";

private static final String USER = "root";

private static final String PASSWORD = "jin1687062650";

private static Connection ct;

private static PreparedStatement ps;

private static ResultSet rs;

static {

// 1.加载驱动,只需要加载一次,所以放到静态代码块中

try {

Class.forName(DRIVER);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

/**

* 描述:封装一个方法可以获得连接,目的可以在其他地方之接调用

*/

public static Connection getConnection() {

try {

ct = DriverManager.getConnection(URL, USER, PASSWORD);

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return ct;

}

/**

* 描述:封装一个方法可以完成查询操作

*

* @param sql 要查询的sql语句

* @param obj 占位符的具体内容

* @return ResultSet 将查询到的结果返回

*/

public static ResultSet executeQuery(String sql, Object... obj) {

// 1.得到连接

ct = getConnection();

// 2.创键发送对象

try {

ps = ct.prepareStatement(sql);

// 处理占位符问题

if (obj != null) {

for (int i = 0; i < obj.length; i++) {

ps.setObject(i + 1, obj[i]);

}

}

rs = ps.executeQuery();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return rs;

}

/**

* 描述:封装一个方法可以完成DDL,DML操作

*

* @param sql 要操作的sql语句

* @param obj 占位符

* @return

*/

public static int executeUpdate(String sql, Object... obj) {

// 1.得到连接

ct = getConnection();

// 2.创键发送对象

try {

ps = ct.prepareStatement(sql);

// 处理占位符问题

if (obj != null) {

for (int i = 0; i < obj.length; i++) {

ps.setObject(i + 1, obj[i]);

}

}

int in = ps.executeUpdate();

close(ct, ps, null);

return in;

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return 0;

}

/**

* 描述:封装一个关闭资源的方法

*

* @param ct 连接对象

* @param ps 发送sql语句对象

* @param rs 返回值对象

*/

public static void close(Connection ct, PreparedStatement ps, ResultSet rs) {

if (rs != null) {

try {

rs.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (ps != null) {

try {

ps.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (ct != null) {

try {

ct.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

// 给外部一个访问ct,和ps的方法

public static Connection getCt() {

return ct;

}

public static PreparedStatement getPs() {

return ps;

}

}

上面代码会用到mysql驱动包,下面给出使用方法

在上面下载的jar包中有mysql的驱动包,把它复制到lib下,然后添加到类库即可,方法和json包的添加一样

68c0c88063b0aa2adc001becbfaf0e84.png

mysql中创建数据库和表

可以通过navicat可视化工具创建数据库和表(可以用自己的方法),下面给出我数据库结构

a50bd903d5ce810dd7a9465e28419ea2.png

57be454f4a0f9e7c9dc4267682fbd518.png

测试

在服务端JDBCUtil.java工具类修改数据库名和数据库密码为自己的

d2cbffa728f7986f092a935d12c7e1e5.png

在客户端中把注册activity的请求服务器的方法里面的URL的ip地址修改成自己的ip地址

dd15ec3b30fc91e645bc1536ce8a980f.png

查看ip地址的方法

win+R,输入cmd进入命令行,然后输入ipconfig

6bbbcd2f0de45642b8e777ee61a30475.png

5791f80077c23377acdb587965f76889.png

启动服务端和客户端项目测试

015a4c2ed03a40e79b2655baba97ca89.png

429420dae73afb1df11048d3249d831e.png

75d2decf41289b3182b8d9ac8867f156.gif

此时mysql已成功写入数据

74545cfa4a35e802dc4ce725b261f7b1.png

总结

这篇关于微信demo的文章就到这里了,希望大家可以多多关注脚本之家的更多精彩内容!

本项目是一个基于安卓Android仿微信客户端-猫友。是一个csdn上的朋友的原创项目,原帖可以看这里http://blog.csdn.net/ericfantastic/article/details/49451249 实现微信的登录注册、主界面、聊天会话、通讯录、发现界面、个人设置、添加好友、扫描二维码、视频通话、等所有基本功能。 下面是具体搭建方法: 1、下载Openfire的安装包:http://download.csdn.net/detail/ericfantastic/9219685 Openfire服务器及MySQL具体配置可以参考:http://www.th7.cn/db/mysql/201406/59838.shtml 2、建议下载Openfire自带的PC客户端Spark,方便测试功能:http://download.csdn.net/detail/ericfantastic/9219815 3、修改源码中的服务器主机地址:在ConnetServer.java中,修改Configuration为本地的IP地址。 4、修改添加好友中的JID主机名:在AddFriendActivity.java中,修改addFriend方法中的"@ericwork-pc"修改为服务器的主机名,不区分大小写; 5、修改聊天页面中的JID主机名:在ChatActivity.java中,修改发送按钮的监听事件中的"@ericwork-pc",同上。 实现一个IM实时聊天应用,少不了弄服务器,目前开源的Openfire服务器就比较合适,而且很多功能都已经封装好了,实现聊天APP就简洁很多。服务器后端的数据库我选择了MySQL,当然Openfire也支持大部分的主流数据库,只要在配置的时候修改好参数即可;搭建的时候,把服务器配到8G内存笔记本上,网上得知,Openfire每个线程大约占4k内存,那理论上是可以80w 用户,当然实际肯定没那么多,Openfire在一台8G的主流服务器上支持30W的用户肯定没有问题。 简单说明一下Eric_JQM_Chat工程目录结构,当初开发的时候初衷只是玩玩openfire实现IM的过程,没想到一写就写了一通,对模块也没有很好的分包,还请多多包涵。 可以脸红的说,基本上所有功能实现都放在第一个eric_jqm_chat包里了,第二个Service包主要放与于后台服务相关的包,但后来这些服务我也都没有启用,后面的四个Zxing包就是实现二维码扫描的包,具体如何实现我的博客里有介绍。 Login登录相关,包括保存当前登录账号密码,下次直接登录使用等功能; Register注册相关,包括本地输入校验; MainActivity主界面相关,包含四个Fragment页面、上方Actionbar及下方的自定义View选项; TabFragment会话界面,用于接收收到的所有消息,并统计条目; TabFragment2通讯录界面,加载用户的好友列表; TabFragment3发现界面,功能尚未添加; TabFragment4个人设置页面,加载个人资料; AddFriendActivity添加好友页面,搜索仅仅是获取用户头像,申请添加好友,及接受好友添加请求并处理; CaptureActivity扫描二维码页面,扫描二维码功能; CatchCameraActivity视频通话页面,仅完成获取前置摄像头预览及获取网络RTSP视频流播放; ConnetServer连接服务器类,单例模式; FormatTools简单工具类,用于各种类型数据间的转换; ChatActivity聊天页面,实现指定好友的聊天功能,及聊天记录的保存; FriendDetail聊天好友详情页面,更改聊天背景等; 主要的类就是这些,具体的详细实现大家可以直接看代码,注释写的很详细了,有疑问的欢迎交流,存在bug还请指正。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值