Android开发,客户端连接本地服务器,数据存储进Mysql

tech2024-09-29  20

客户端连接本地服务器,将数据存储进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 有任何问题,错误,欢迎指正,qq:2569658002

最新回复(0)