客户端连接本地服务器,将数据存储进Mysql,实现客户端与服务器的交互。
本博客由一位小白所写,故所有的代码,开源框架都会以萌新的角度讲解,如果有任何的错误,欢迎指正,共同进步。
本博客目的:
- 实现安卓客户端与本地服务器的数据发送与接收,实现交互。
- 实现本地服务器与Mysql数据库的连接,与数据存储。
小白说明:
1.安卓sdk已经自带了SQLite数据库,很多本地数据都可以直接存储于这个轻量级数据库,并且有许多优秀的开源框架,如greenDao等。但是,一个非单机的安卓应用是不可能将核心数据存储于本地的,更不可能让客户端直接与数据库相连接。 一般客户端是和服务器打交道, 客户端发出请求,服务器响应请求,经过三次握手,开始进行数据交互,而数据库的操作也大部分由服务器连接完成。
就好比你去餐厅吃饭, 厨师会从冰箱把食物拿出,加工后呈上来给你。这个情景中, 你就等于客户端, 厨师相当于服务器, 冰箱就是数据库。
2.本地服务器可以实现局域网下,客户端与服务器,客户端与客户端的交互。如果 使用云服务器,比如 阿里云,腾讯云,华为云等,就可以将你服务器搭建于此,根据公网ip进行广域网网络的访问(就是打开移动数据,在全国各地都能使用你的应用)。对于云服务器的搭建,小白还在学习中,期待尽快实现,搭云服务器遇到太多坑了,哭了。
正文:
准备工具:
1.Myeclipse(用于搭建本地服务器,也可以eclipse-ee)
2.Tomcat服务器(就几M,网上有)
3. jdk
4. mysql数据库(为甚么 不是Oracle呢?因为这个免费)
5. navicat数据库视觉显示(好东西,就不用使用命令行查看黑白)
6. AndroidStudio安卓开发ide(这个就是废话了,嚯嚯)
准备开源库:
1.Okhttp
2.struts
对于工具如何安装,我就不多说了,网上有很多很多资料的,struts库的使用:
当所有软件安装完成后,我们就可以开始咯。
—————————————————————————
客户端(AndroidStudio):
1.添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
2. xml文件,2个EditText,1个Button, 1个Textview.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".LinktoServerActivity">
<EditText
android:layout_weight="2"
android:id="@+id/usenameer"
android:hint="账号"
android:layout_width="match_parent"
android:layout_height="0dp" />
<EditText
android:layout_weight="2"
android:id="@+id/passworder"
android:hint="密码"
android:inputType="numberPassword"
android:layout_width="match_parent"
android:layout_height="0dp" />
<Button
android:layout_gravity="center"
android:id="@+id/dengluButton"
android:text="登录"
android:layout_width="80dp"
android:layout_height="50dp" />
<TextView
android:id="@+id/xianshi"
android:textSize="25dp"
android:text="吧唧吧唧"
android:layout_weight="1"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="0dp" />
<LinearLayout
android:layout_weight="4"
android:layout_width="match_parent"
android:layout_height="0dp"></LinearLayout>
</LinearLayout>
- Activity.java文件
package com.ilikelxystill.fuxi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.ilikelxystill.fuxi.constant_package.Constant_name;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttp;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class LinktoServerActivity extends AppCompatActivity {
private EditText usenameer,passworder;
private TextView xianshi;
private Button dengluButton;
private Constant_name constant_name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_linkto_server);
init();
constant_name = new Constant_name();
LinkServerer();
}
public void init(){
usenameer =(EditText)findViewById(R.id.usenameer);
passworder =(EditText)findViewById(R.id.passworder);
xianshi = (TextView)findViewById(R.id.xianshi);
dengluButton =(Button)findViewById(R.id.dengluButton);
}
//连接服务器
public void LinkServerer(){
dengluButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取输入的数据
String getusenameer = usenameer.getText().toString();
String getpassworder = passworder.getText().toString();
//建立客户端
OkHttpClient okHttpClient = new OkHttpClient();
//实例化请求构造器
Request.Builder builder = new Request.Builder();
Log.i("haha",constant_name.getUrlInMyCompter()+constant_name.getProjectname()+"Login?usename="+getusenameer+"&password="+getpassworder);
//构造器使用get方式绑定 url
Request request = builder.get().url(constant_name.getUrlInMyCompter()+constant_name.getProjectname()+"Login?usename="+getusenameer+"&password="+getpassworder).build();
//建立Call
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("baba","shibai!!!!!!!!!!!!");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String StrGetFromServer = response.body().string();
xianshi.post(new Runnable() {
@Override
public void run() {
xianshi.setText(StrGetFromServer);
}
});
}
});
usenameer.setText("");
passworder.setText("");
}
});
}
}
4.新建一个包,constant_package
Constant_name.java
package com.ilikelxystill.fuxi.constant_package;
public class Constant_name {
//电脑的主机地址,以及端口号,一般是8080
private String UrlInMyCompter = "http://192.168.3.6:8888/";
//服务器项目名
private String Projectname = "FuxiServer/";
public String getUrlInMyCompter() {
return UrlInMyCompter;
}
public String getProjectname() {
return Projectname;
}
}
—————————————————————————
Myeclipse
服务器项目名:FuxiServer
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<constant name="struts.devMode" value="true"></constant>
<package name="default" namespace="/" extends="struts-default">
<!-- 在浏览器敲路径名/denglu,会找到class这个类,的denglu方法 -->
<action name="Login" class="com.ilikexy.UserAction" method="index"></action>
</package>
</struts>
UserAction.java
package com.ilikexy;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
//新建一个类,继承 ActionSupport
public class UserAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private String usename;
private String password;
public String index() throws IOException, SQLException, Exception{
System.out.println("账号:"+getUsename()+"\n"+"密码:"+getPassword());
//返回给客户端的信息
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
//转化为写入
PrintWriter writer = response.getWriter();
//将其写入数据库,当账号和密码都不为空时
if((!getUsename().equals(""))&&(!getPassword().equals(""))){
Class.forName("com.mysql.cj.jdbc.Driver");
//原生的Sql语句,向表中插入usename,和 password
String sql = "insert into fuxiRegister values('"+getUsename()+"','"+getPassword()+"')";
//连接数据库路径,数据库名为firstdatabase
String linktodatabase = "jdbc:mysql://localhost:3306/firstdatabase?useSSL=false&serverTimezone=UTC";
//建立数据库的连接
Connection con = DriverManager.getConnection(linktodatabase,"root","123456");
//执行sql语句
PreparedStatement prt = con.prepareStatement(sql);
prt.execute();
//存入成功返回给客户端信息
//写入信息
writer.write("login successful !!!!");
}else{
//写入信息
writer.write("login Fail !!!!");
}
return null;
}
public String getUsename() {
return usename;
}
public void setUsename(String usename) {
this.usename = usename;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
navicat
有任何问题,错误,欢迎指正