Android Studio和阿里云数据库实现一个远程聊天程序
作者:嘿,请叫我小哥 发布时间:2023-06-14 21:09:16
标签:Android,Studio,阿里云,远程聊天
没有阿里云数据库的可以买个最便宜的,我是新用户9.9元买了一个
1.买到后点击左上角的工作台
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
开始写Android Studio项目代码了,先来看看我的项目结构
依赖包下载地址 Central Repository: mysql/mysql-connector-java (maven.org)
我第一次下了个版本比较新的发现会报错,由于我能力有限,所以就老实下载一个低版本的
添加依赖包应该都会了吧,不要忘了添加后还要添加到模块
MainActivity代码如下
注意代码里涉及SQL语句,这里要根据你之前新建的数据库和新建的表来写,我新建的表是test
import android.os.Bundle;
import android.os.Looper;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MainActivity extends AppCompatActivity {
private TextView t1; //用于显示获取的信息
private Button sendmsg; //发送消息按钮
private EditText et_msg;//用户输入信息框
private String user="user"; //默认用户昵称
private boolean T=false;//发送标志位
//数据库连接类对象
private static Connection con = null;
private static PreparedStatement stmt = null;
private Button revise;
private EditText et_revise;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化
t1 = findViewById(R.id.t1);
et_msg = findViewById(R.id.msg);
et_revise = findViewById(R.id.reviseText);
sendmsg = findViewById(R.id.button);
revise = findViewById(R.id.revise);
revise.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
user = et_revise.getText().toString();
Toast.makeText(MainActivity.this,"修改成功",Toast.LENGTH_SHORT).show();
}
});
sendmsg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { T=true; }
});
//TODO 启动发送线程,用按钮控制发送标志位T,来进行发送信息【注意:连接数据库必须在线程内,不然会报错】
Threads_sendmsg threads_sendmsg = new Threads_sendmsg();
threads_sendmsg.start();
//TODO 启动获取数据线程,读取数据库里的信息【注意:连接数据库必须在线程内,不然会报错】
Threads_readSQL threads_readSQL = new Threads_readSQL();
threads_readSQL.start();
}
class Threads_sendmsg extends Thread {
@Override
public void run() {
while (true){
while (T){
try {
con = MySQLConnections.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
try {
//注意你数据库中是否有 test 这个表,我新建的表是 test
//还有我的属性,是否和我一样呢,不一样就按你自己的来吧
String msg =et_msg.getText().toString().trim(); //用户发送的信息
if (msg.isEmpty()){
Looper.prepare();
Toast.makeText(MainActivity.this, "消息为空", Toast.LENGTH_SHORT).show();
Looper.loop();
T=false;
break;
}
if (msg.length()>199){
Looper.prepare();
Toast.makeText(MainActivity.this, "消息长度超过限制", Toast.LENGTH_SHORT).show();
Looper.loop();
T=false;
break;
}
if (con!=null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "发送成功", Toast.LENGTH_SHORT).show();
}
});
String sql = "insert into test(name,msg,sign) values(?,?,?)";
stmt = con.prepareStatement(sql);
// 关闭事务自动提交 ,这一行必须加上
con.setAutoCommit(false);
stmt.setString(1,user);
stmt.setString(2,msg);
stmt.setInt(3,1);
stmt.addBatch();
stmt.executeBatch();
con.commit();
}
}catch (SQLException e){
System.out.println(e);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"请输入正确的语句",Toast.LENGTH_SHORT).show();
}
});
}
T=false;
}
}
}
}
class Threads_readSQL extends Thread {
ResultSet rs;
@Override
public void run() {
while (true) {
try {
con = MySQLConnections.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
try {
//注意你数据库中是否有 test 这个表,我新建的表是 test
//还有我的属性,是否和我一样呢,不一样就按你自己的来吧
String sql = "select name,msg,sign from test";
if (con != null) {
stmt = con.prepareStatement(sql);
// 关闭事务自动提交
con.setAutoCommit(false);
rs = stmt.executeQuery();//创建数据对象
//清空上次发送的信息
t1.setText(null);
while (rs.next() ) {
t1.append(rs.getString(1) + "\n" + rs.getString(2) + "\n\n");
}
con.commit();
rs.close();
stmt.close();
}
//2秒更新一次
sleep(2000);
} catch (Exception e) {
System.out.println(e);
runOnUiThread(new Runnable() {
@Override
public void run() {
//Toast.makeText(MainActivity.this,"请输入正确的语句",Toast.LENGTH_SHORT).show();
}
});
}
}
}
}
}
MainActivity布局文件activity_main.xml
<?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"
tools:context=".MainActivity"
android:orientation="vertical">
// An highlighted block
<TextView
android:id="@+id/t1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="10"
android:text="Hello World!"
android:layout_marginLeft="8dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal">
<EditText
android:id="@+id/reviseText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:hint="请输入你的昵称"
android:inputType="textPersonName" />
<Button
android:id="@+id/revise"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="修改" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal">
<EditText
android:id="@+id/msg"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:ems="10"
android:hint="请输入内容"
android:inputType="textPersonName" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="发送" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
MYSQLConnections代码如下
注意我写的注释,用户名,密码,外网地址,外网端口号,数据库名称,这些都要填写你自己的
import java.sql.Connection;
import java.sql.DriverManager;
public class MySQLConnections {
private String driver = "";
private String dbURL = "";
private String user = "";
private String password = "";
private static MySQLConnections connection = null;
private MySQLConnections() throws Exception {
driver = "com.mysql.jdbc.Driver"; //这里根据你下载的依赖包版本会有不同的写法,下载低版本的就是这样写
//rm-bp1lxt0mjpf6o.mysql.rds.aliyuncs.com:3306 这个是外网地址,3306是外网端口号,这些都需要填写你自己的
//sqlconsole 这个是你登录你的数据库后新建的数据库(应该不绕口吧)
dbURL = "jdbc:mysql://rm-bp1lxt0m.mysql.rds.aliyuncs.com:3306/sqlconsole";
user = "user"; //你新建库时的用户名
password = "123456"; //你新建库时的密码,这里我就不写我的真密码了
System.out.println("dbURL:" + dbURL);
}
public static Connection getConnection() {
Connection conn = null;
if (connection == null) {
try {
connection = new MySQLConnections();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
try {
Class.forName(connection.driver);
conn = DriverManager.getConnection(connection.dbURL,
connection.user, connection.password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
AndroidManifest.xml
注意这里要添加网络请求权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mysqlconnections">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:usesCleartextTraffic="true"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication1">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
最后看我运行结果
参考博客
Android Studio 连接阿里云数据库【制作基于数据库的多人远程聊天APP】
来源:https://blog.csdn.net/qq_45682662/article/details/121215078


猜你喜欢
- springboot:接收date类型的参数今天有个postmapping方法,地址都正确,就是死活进不去,真是奇怪了。终于从日志中得出些端
- 一、引言在许多编程语言中,都有函数回调这一概念。C 和 C++ 中有函数指针,因此可以将函数作为参数传给其它函数,以便过后调用。而在 Jav
- 在spring Boot中,有些代码是WEB功能,例如API等,但是有些逻辑是非WEB,启动时就要调用并持续运行的,该如何加载自己的非WEB
- 1. 认识ZoneZone像一个沙盒,是我们代码执行的一个环境。我们的main函数默认就运行在Root Zone当中。子Zone的构造有点像
- 本文实例讲述了Java中public static void main(String args[])的来龙去脉。分享给大家供大家参考,具体如
- 在Controller层时,往往会需要校验或验证某些操作,而在每个Controller写重复代码,工作量比较大,这里在Springboot项
- 本文实例为大家分享了ActionBar下拉式导航的实现代码,供大家参考,具体内容如下利用Actionbar同样可以很轻松的实现下拉式的导航方
- 模式虽然精妙,却难完美,比如观察者模式中观察者生命周期的问题;比如访问者模式中循环依赖的问题等等;其它很多模式也存在这样那样的一些不足之处,
- 涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法;这就需要我们
- Java中普通代码块,构造代码块,静态代码块区别及代码示例//执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块
- 一、服务端TcpListener server = new TcpListener(IPAddress.Parse("127.0.
- 产生90-100的重复的随机数:public class RandomTest { public static void main(Str
- 描述项目中用到boot 整合 mybatis-plus , 个人在使用分页条件查询的时候一直查不出 total, pages, 终于找到原因
- 线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代
- 一、前言目前大部分手机都是 60Hz 的刷新率,也就是 16.6ms 刷新一次,系统为了配合屏幕的刷新频率,将 Vsync 的周期也设置为
- 效果 使用compile 'site.gemus:openingstartanimation:1.0.0' //在gra
- 简介Microsoft官网关于 WindowChome 的介绍截取Microsoft文章的一段话:若要在保留其标准功能时自定义窗口,可以使用
- 先申明一个枚举: public enum Test_Enum  
- 使用正则表达式,效率较高public boolean canParseInt(String str){if(str == null){ //
- springboot + docker + jenkins自动化部署项目,jenkins、mysql、redis都是docker运行的,并且