如何保证两端时间一致性

如何保证两端时间一致性,第1张

Android与服务器通讯:如何保证两端时间一致性
在AChat项目的开发过程中,项目要求无论终端是什么时区设置、地处何方,终端的时间是否正确,post到服务器的数据包里面的时间字段均要求跟服务器同步,也就是说,用户买来一部新手机、新平板,不做任何日期时间、时区方面的设置,装了App就用,也能让时间数据正确。
我是这样设计的,在app的setting中有3个变量org_tablet_tm,org_server_tm和server_timezone,App启动的时候,即联线服务器取回当时的时间和服务器所在时区分别保存在org_server_tm和server_timezone,同一刻,取终端的时间保存在org_tablet_tm。
定义now()函数,此函数取当前设备时间再加上org_server_tm-org_tablet_tm的差值。
/
永远以server为准
@return
/
public static Date now(){
Date w_ret=new Date();
w_retsetTime(w_retgetTime()+(org_server_tm-org_tablet_tm));
return w_ret;
}
好了,这时候尽管设备终端的时间乱七八糟,只要时区跟服务器时区一致,用now()函数即可获得服务器上此时此刻的时间。
但是,问题来了,每个用户的终端设备时区不一定跟服务器上的一致,有可能他们根本没调时间、或没勾上自动同步时间,这时候需要我们用代码实现在终端不同时区也能跟服务器上的时间同步。
先看看这个DateTimeConvertToServer这个函数,先从tm中减去当前时区跟格林威治之间的时间差,再加上服务器所在时区跟格林威治时间差,即可算出到服务器时间:
/
把当地的时间转为服务器当时的时间,一般递交数据前先把Date一类数据转换
@param tm
@return
/
public static Date DateTimeConvertToServer(Date tm){
if (tm==null)return null;
tm=new Date(tmgetTime()-getDiffTimeZoneRawOffsetStd(TimeZonegetDefault()getID())); //转成格林威治时间
Date d=new Date(tmgetTime()+getDiffTimeZoneRawOffsetStd(server_timezone));
return d;
}
再看getDiffTimeZoneRawOffsetStd函数,用于计算指定时区跟格林威治时区的时间差(毫秒):
/
计算出指定时区跟格林威治时间差
@param timeZoneId
@return
/
public static int getDiffTimeZoneRawOffsetStd(String timeZoneId) {
//return TimeZonegetTimeZone(timeZoneId)getRawOffset();
TimeZone tz = TimeZonegetTimeZone(timeZoneId);
return tzgetOffset(GregorianCalendargetInstance(tz)getTimeInMillis());
}
我在参数里面配置一个选项”是否转换成终端时间“,若转换,则什么都不做,因为Android系统能根据当前设置的时区自动转换时间,若不转换,则显示服务器端时间,则需要用DateTimeConvertToServer函数转换一下。
补充一下截图,当前平板时间乱套,时区是巴库asia/baku,服务器是东8区,下面是平板截图:
服务器上保存的数据:
==================================
完结前吐槽一下,网络上流传一段时区差的计算函数,它们用TimeZone的getRawOffset,当时我也抄来用,各种时区试一遍,开始是各种适合,但测试到Asia/Baku时顿时石化了,同样是东5区的卡拉奇、乌拉尔都没问题,自巴库起开始一路往西的时区都相差一小时!!!用getRawOffset获得巴库离格林威治差4小时,但应该是5小时!!由于时间问题没仔细分析什么原因,有空再看并。

通过游侠之类的平台启动的ygopro一定会在游戏结束时关闭, 因为有平台本身提供房间列表所以没什么关系; 直接在ygopro里连接外服之类的服务器的话游戏结束时一般会退回到联机界面, 要再开始一次游戏只能自己再建房间之类的。

回合时间是可以设置的, 但有的平台/服务器是固定时间限制, 一般来说即使是永火那种需要一回合需要长 *** 作说书的只要比较熟悉 *** 作60秒也是很充裕的, 如果你经常经常超时间真该反省一下, 网战遇到那些 *** 作慢吞吞没必要长考却等每回合半天的对手真的是非常烦的。

软件正式名称YGOPro(国内仍广泛使用旧名字ygocore),是一款游戏王决斗系统,属于免费开源软件,可以在Github上找到源代码,甚至参与开发。软件的主要作者是Fluorohydride,国内经常称其为圆神。

软件已收录了游戏王OCG全部卡片共10000多张,并在不断更新。软件的卡片是用LUA脚本语言编写的,这意味着较强的扩展性,新卡和DIY卡一般无需升级主程序即可被添加到游戏中。

原版

ygocore最早最基本的版本,是这一软件的开端,由Fluorohydride(一般称为圆神)开发。圆神版从设计到能拿出一个能用的程序的过程基本上是圆神一个人在做,可以说圆神开启了这个时代。

软件最初名为ygocore,后改为YGOPro。

作为开源项目,ygocore的源码可以在github找到。项目成熟后得到了很多爱好者的代码贡献,在github本项目主页上即可查看。github项目管理权限由圆神、salix5(繁体版作者)、独孤朲(娱乐力量全开,原版发布者)等人持有。


#vim  /etc/profile

export TMOUT=300

若300秒内无输入,则退出当前bash 这个可以?

试了一下,远程和本机bash均退出了(偶使用的是vmware虚拟机做的)。暂时定为这个胜出吧!

但是这个是在客户端无发送请求包保持连接的情况下,若强制在服务器断开连接呢?得到这样的答案:

写个脚本   到2个小时就kill掉

弄脚本 干掉

#fuser -k /dev/pts/

#pkill -kill -t pts/

这两个应该都可以 干掉所有连接

但是试过都没成功,而且也没理解这命令的含义,所以就用我自己麻烦的办法kill了一下:

kill -9 `ps aux | grep ssh |grep @ |awk '{print $2}'`

在这里能用成。

另外,Xshell工具连接的:

服务器默认就是会断开的,但是连接工具会设置 发送活动状态;

在属性-连接-保持活动状态中,将会话期间保持活动状态前面框里,去掉这个勾选,就ok了!

人渣服务器管理者自行调整时间方法。
1、默认的是白天4小时晚上2小时,服务器管理者自行调整时间,夜间时间没有固定时间。
2、进入到scum空投箱里面,打开背包拿出撬棍。
3、按下f键,开始撬锁,进度条到达100%之后即可打开空投箱拿取里面的东西了。空投时间就是这样填正的。

你在"开始-设置-控制面板",你在"控制面板"里找到"区域和语言选项",然后单击"自定义",在d出的对话框中选择"时间",你可以看到"时间格式",你可以选择"H:mm:ss"(24小时)(下面有提示的)

可能出于一些原因你需要手动修改自己电脑的时间日期设置,在用完之后该如何快速的恢复到原来的正确时间,而不影响你的正常使用呢,这时要设置电脑时间自动同步网络internet时间。
1、点击桌面右下角的时间,在d出框内点击更改日期时间设置。
2、在d出框内选择Internet选项。
3、点击更改设置,要同步Internet时间的前置条件是得启动你windows time服务,下面会介绍到如何启动windows的时间服务。如果windows时间服务已启动直接在d出框点立即更新即可。
4、找到我的电脑,右键在d出选项框中选择管理,会出现计算机管理页面。
5、找到最下面的服务和应用程序单击那个小三角,在展开选项中选择服务,会出现windows的服务列表。
6、在列表中找到windows Time服务,选中之后在又上角会显示启动服务的按钮,点击启动。
7、启动之后关于此服务右上角的 *** 作按钮会变为停止或重新启动,如此你的电脑时间会自动跟网络同步。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10374003.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-08
下一篇 2023-05-08

发表评论

登录后才能评论

评论列表(0条)

保存