我自己都感觉这个标题好像论文。(××××××××的设计与实现)
因为最近在尝试写《商人》网路游戏的服务端,要有时间定时循环执行,要有往数据库写数值。然后玩家的手机上微信,从数据库下载数据,实现游戏玩起来。
所以这篇文章讲了我昨天的进展,定时存数据。
我有两个文件,实际上我也是为了将来维护方便,才分开来写的。
mainGame.java 这个文件是主功能,
gameEnterFrame.java 这个文件是定时循环功能。
他们都隶属于game包中。
先看第一个mainGame.java的代码:
package game;
import game.gameEnterFrame;//把定时循环类导入进来,一会要用。
public class mainGame {
//游戏运行,最主要的权限最高的main方案,无返回值。只要运行,就会先运行main。
//static意思是 我是绝对的,唯一的,至高无上的,不允许重名的。只要提到这个main名字就一定是我,的意思。
//public 意思是对外公开,只要你在别的地方导入了mainGame类,就可以执行mainGame类下的public的功能。
public static void main(String[]args){
//我想要一个定时循环类,起名叫aa吧,它是一个全新的定时循环类。
gameEnterFrame aa = new gameEnterFrame();
//现在执行aa的start功能。里面有啥看下一文件的代码。
aa.start();
System.out.println("GameStart");
}
}
代码不多,就是启动后,运行一次,gameEnterFrame.
再贴出下面的代码:
package game;
//这些导入的包你可以不用知道他们是干嘛的,因为只要使用MyExclipse软件敲代码,就会提示你,帮你自动添加导入,而且自动加的非常准确。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Timer;//导入定时器类
import java.util.TimerTask;//导入定时任务类
//由于gameEnterFrame是继承自TimerTask类的。
//TimerTask类有这么一个关键的功能叫做run,是前人们已经写好的功能了。也是必须有的功能。只要继承了TimerTask的类一自动执行,就自动运行run里面的动作。
public class gameEnterFrame extends TimerTask {
//声明内部使用一个数据库链接,起名conn,这个conn酌情改代码
private Connection conn;
//声明内部使用一个数据库驱动地址,不知何用,固定用法,不写就报错。这个地方酌情改代码
private String JDBC_DRIVER = "com.mysql.jdbc.Driver";
//声明内部使用mysql数据库的网络IP+端口+链接的数据库名字,这个地方酌情改代码
private String DB_URL = "jdbc:mysql://192.168.0.11:3306/gmbusiness";
//声明内部使用连接数据库的用户名,这个地方酌情改代码
private String user = "root";
//声明内部使用连接数据库的密码,这个地方酌情改代码
private String password = "root";
//我需要一个时间量,起名叫startdate吧,它是一个全新的时间量,他的值是现在这一刻的时间。
Date startdate = new Date();
//我需要一个定时器,起名叫itimer吧,它是一个全新的定时器。
private Timer itimer = new Timer();
public void start(){
//schedule英文翻译为“日程安排”,是定时器类下属的功能方案。在我们程序中是最关键的功能,后面有好几种参数情况,其中三个参数时候代表(做啥方案,啥时间开始,多少毫秒后再做),
//要注意的是java里面的时间是单独的数据类型,区别于浮点数、整数、字符串类型。
//所以需要声明一下开始时间。我觉得使用“现在”作为开始时间最合适。这样每次程序运行时就立即开始。
//所以我在上面声明了一个startdate。接着让任务每隔2秒钟运行一次。
itimer.schedule(this, startdate, 2000);
//你可能要问了,this是啥?this意思是当下方案。这里指gameEnterFrame。
}
//下面来看看这个自动运行都运行了啥动作
public void run() {
float n = (float) 1.22;//我瞎写的一个1.22数,后面会被修改为随机数。这里不必较真。
n = (float) Math.random();//我需要生成随机数,一会往数据库里面写。
System.out.println("Server make a new number : " +n );//把这个数打印出来方便我看。
//我发现链接数据库大家都爱用try。因为网络不稳定就会连不上,但不能崩了程序。
try {
//固定用法,连接数据库。为的是后面往数据里写数
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(DB_URL,user,password);
//准备往数据库里写啥值,引号中是mysql语句。
//java并不是直接往mysql里面写数据,而且先打个招呼,传达一下即将要填写的数在哪行哪列,具体的数则是留出问号,再让程序做填空题。
String sql = "insert into goods_price (price) values (?)";
//声明一个预处理语句叫rs,是个空的。
PreparedStatement rs = null;
//先把格式填写进去,等着填空。
rs = conn.prepareStatement(sql);
//而且据说每次只能写一个值,写入一个float类型的数值,在第一个位上把n的值(刚生的随机数)写进去。
rs.setFloat(1,n);
//写完了更新吧
rs.executeUpdate();
//关闭数据库操作通道
rs.close();
//关闭数据库连接,固定用法
conn.close();
//以下到代码最后是MyEclipse自动帮我写的。
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
定时循环执行的部分代码较多,写好后点击运行,就可以看到打印出来的数据啦。
祝你成功!