月度归档: 2021 年 5 月

spring的Bean初始化方法的2种方式

环境 jdk1.8、springboot、idea

 

代码案例

  • 【方式一】实现接口方式InitializingBean

面试官:说下spring的Bean初始化方法的2种方式 程序员:不知道

 

  • 【方式二】通过xml配置方式<bean init-method=”myInit” /bean>

面试官:说下spring的Bean初始化方法的2种方式 程序员:不知道

 

  • 运行结果

面试官:说下spring的Bean初始化方法的2种方式 程序员:不知道

 

spring源码分析

  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactoryinvokeInitMethods方法 【自己可以找下】

面试官:说下spring的Bean初始化方法的2种方式 程序员:不知道

 

  • 注意这里是直接通过Bean的方法去调用afterPropertiesSet

面试官:说下spring的Bean初始化方法的2种方式 程序员:不知道

 

  • 这里是<bean init-method=”myInit” /bean>执行的地方

面试官:说下spring的Bean初始化方法的2种方式 程序员:不知道

 

  • 下面是debug的信息

面试官:说下spring的Bean初始化方法的2种方式 程序员:不知道

 

面试官:说下spring的Bean初始化方法的2种方式 程序员:不知道

 

  • 通过反射java.lang.reflect.Method的invoke方法去执行

面试官:说下spring的Bean初始化方法的2种方式 程序员:不知道

 

  • DisposableBean和 destroy-method=”myDestroy” 的源码
  • 也是一个Bean方法直接调用,一个反射destroy-method

面试官:说下spring的Bean初始化方法的2种方式 程序员:不知道

 

面试官:说下spring的Bean初始化方法的2种方式 程序员:不知道

 

总结

  • Spring 2种Bean初始方法的执行方式,可以同时执行,接口方式InitializingBean先执行,配置init-method方式后执行,详情请见spring源码
  • 执行效率分析,接口InitializingBean方式比 通过反射配置init-method方式快。
  • 其他特性请debug进去自己看看,源码还是要看看的。

Android 退出整个程序代码

今天在网上看见个博客关于退出整个程序的,感觉不错,拿来分享学习

SysApplication这个类复制到工程里面,然后在每个Acitivity的oncreate方法里面通过SysApplication.getInstance().addActivity(this); 添加当前Acitivity到ancivitylist里面去,*后在想退出的时候调用SysApplication.getInstance().exit();可直接关闭所有的Acitivity并退出应用程序。

  1. import java.util.LinkedList;
  2. import java.util.List;
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.app.Application;
  6. import android.content.DialogInterface;
  7. import android.content.Intent;
  8. public class SysApplication extends Application {
  9. private List mList = new LinkedList();
  10. private static SysApplication instance;
  11. private SysApplication() {
  12. }
  13. public synchronized static SysApplication getInstance() {
  14. if (null == instance) {
  15. instance = new SysApplication();
  16. }
  17. return instance;
  18. }
  19. // add Activity
  20. public void addActivity(Activity activity) {
  21. mList.add(activity);
  22. }
  23. public void exit() {
  24. try {
  25. for (Activity activity : mList) {
  26. if (activity != null)
  27. activity.finish();
  28. }
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. } finally {
  32. System.exit(0);
  33. }
  34. }
  35. public void onLowMemory() {
  36. super.onLowMemory();
  37. System.gc();
  38. }
  39. }

在应用程序里面 的activity的oncreate里面添加SysApplication.getInstance().addActivity(this)
如:

  1. public void onCreate(Bundle savedInstanceState)
  2. {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.main);
  5. SysApplication.getInstance().addActivity(this);
  6. }

 

Android 完全退出当前应用程序的四种正确方法

Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A。在B中如何关闭整个Android应用程序呢?本人总结了几种比较简单的实现方法
1. Dalvik VM的本地方法

复制代码代码如下:

android.os.Process.killProcess(android.os.Process.myPid())    //获取PID
System.exit(0);   //常规java、c#的标准退出法,返回值为0代表正常退出

2. 任务管理器方法
首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
系统会将,该包下的 ,所有进程,服务,全部杀掉,就可以杀干净了,要注意加上
<uses-permission android:name=\”android.permission.RESTART_PACKAGES\”></uses-permission>

3. 根据Activity的声明周期

我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志     Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。

在A窗口中使用下面的代码调用B窗口

复制代码代码如下:

Intent intent = new Intent();
intent.setClass(Android123.this, CWJ.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置
startActivity(intent);
接下来在B窗口中需要退出时直接使用finish方法即可全部退出。

4.自定义一个Actiivty 栈,道理同上,不过利用一个单例模式的Activity栈来管理所有Activity。并提供退出所有Activity的方法。代码如下:

复制代码代码如下:

* 将项目里面的activity管理起来;退出应用时,清除内存;
*/

public class ActManager {

private static Stack<Activity> activityStack;
private static ActManager instance;

/**
* 单例模式 创建单一实例
*
* @return
*/
public static ActManager getAppManager() {
if (instance == null) {
instance = new ActManager();
}
return instance;
}

/**
* 初始化Stack<Activity>
*/
private static void initActivityStack() {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
}

/**
* 添加Activity到堆栈
*
* @param activity
*/
public static void addActivity(Activity activity) {
initActivityStack();
activityStack.add(activity);
}

/**
* 获取当前Activity(堆栈中*后一个压入的)
*
* @return
*/
public static Activity currentActivity() {
Activity activity = activityStack.lastElement();
return activity;
}

/**
* 结束指定的Activity
*/
public static void finishActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}

/**
* 结束当前Activity(堆栈中*后一个压入的)
*/
public static void finishActivity() {
//获取到当前Activity
Activity activity = activityStack.lastElement();
//结束指定Activity
finishActivity(activity);
}

/**
* 结束指定类名的Activity
*/
public static void finishActivity(Class<?> cls) {
List<Activity> activities = new ArrayList<Activity>();
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
// finishActivity(activity);
activities.add(activity);
}
}
// 结束所有类名相同activity
activityStack.removeAll(activities);
for (Activity activity : activities) {
finishActivity(activity);
}
}

/**
* 结束所有Activity
*/
public static void finishAllActivity() {
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (null != activityStack.get(i)) {
Activity activity = activityStack.get(i);
if (!activity.isFinishing()) {
activity.finish();
}
}
}
activityStack.clear();
}

/**
* 退出应用程序
* 这里关闭的是所有的Activity,没有关闭Activity之外的其他组件;
* android.os.Process.killProcess(android.os.Process.myPid())
* 杀死进程关闭了整个应用的所有资源,有时候是不合理的,通常是用
* 堆栈管理Activity;System.exit(0)杀死了整个进程,这时候活动所占的
* 资源也会被释放,它会执行所有通过Runtime.addShutdownHook注册的shutdown hooks.
* 它能有效的释放JVM之外的资源,执行清除任务,运行相关的finalizer方法终结对象,
* 而finish只是退出了Activity。
*/
public static void AppExit(Context context) {
try {
finishAllActivity();
//DalvikVM的本地方法
// 杀死该应用进程
//android.os.Process.killProcess(android.os.Process.myPid());
//System.exit(0);
//这些方法如果是放到主Activity就可以退出应用,如果不是主Activity
//就是退出当前的Activity
} catch (Exception e) {
}
}
}

复制代码代码如下:

android.os.Process.killProcess(android.os.Process.myPid())    //获取PID
System.exit(0);   //常规java、c#的标准退出法,返回值为0代表正常退出

 

 

AndroidStudio按钮Button退出程序

AndroidStudio 3.1.4

%title插图%num%title插图%num

1.创建一个新的项目,项目名称为Button,界面为activity_button.xml

%title插图%num%title插图%num

2.打开activity_button.xml

%title插图%num%title插图%num

3.点击HelloWorld标签,按Delete删除

%title插图%num%title插图%num

4.左侧组件栏选择Common – Button

%title插图%num%title插图%num

5.将Button组件拖到界面上,大概中间的位置

%title插图%num%title插图%num

6.右侧修改属性

%title插图%num%title插图%num

onClick是鼠标点击事件接收函数,后面写代码需要用到

7.界面完成后的样子

%title插图%num%title插图%num

8.双击java\com.包名.button后面不带括号的

%title插图%num%title插图%num

9.代码编辑框下写代码

%title插图%num%title插图%num

10.代码如下

showdialog为鼠标按下事件接收函数,这个子程序是在鼠标按下按钮Button时触发

 1     public void showdialog(View view)
 2     {
 3         //定义一个新的对话框对象
 4         AlertDialog.Builder alertdialogbuilder=new AlertDialog.Builder(this);
 5         //设置对话框提示内容
 6         alertdialogbuilder.setMessage("确定要退出程序吗?");
 7         //定义对话框2个按钮标题及接受事件的函数
 8         alertdialogbuilder.setPositiveButton("确定",click1);
 9         alertdialogbuilder.setNegativeButton("取消",click2);
10         //创建并显示对话框
11         AlertDialog alertdialog1=alertdialogbuilder.create();
12         alertdialog1.show();
13 
14     }

监听上面定义的对话框按钮事件

 1     private DialogInterface.OnClickListener click1=new DialogInterface.OnClickListener()
 2     {
 3         //使用该标记是为了增强程序在编译时候的检查,如果该方法并不是一个覆盖父类的方法,在编译时编译器就会报告错误。
 4         @Override
 5 
 6         public void onClick(DialogInterface arg0,int arg1)
 7         {
 8             //当按钮click1被按下时执行结束进程
 9             android.os.Process.killProcess(android.os.Process.myPid());
10         }
11     };
12 
13     private DialogInterface.OnClickListener click2=new DialogInterface.OnClickListener()
14     {
15         @Override
16         public void onClick(DialogInterface arg0,int arg1)
17         {
18             //当按钮click2被按下时则取消操作
19             arg0.cancel();
20         }
21     };
22 
23 }

11.完成编写后点击右上角的AVD Manager

%title插图%num %title插图%num%title插图%num

12.选择已下载的模拟器

%title插图%num%title插图%num

13.如果没有下载模拟器可以点击下方的Create Virtual Device进行下载

14.点击Actions下的播放按钮进行运行

%title插图%num%title插图%num

15.成功开启后的样子

%title插图%num%title插图%num

16.点击菜单栏Run下的Run ‘app’进行调试

%title插图%num%title插图%num

17.选择刚刚开启的模拟器型号,点击OK

%title插图%num%title插图%num

18.程序会进行编译,如果没有错误在模拟器中会正常显示

%title插图%num%title插图%num

19.点击调试中软件的BUTTON

%title插图%num%title插图%num

20.点击确定,软件正常结束,证明调试成功

%title插图%num%title插图%num

21.可以选择带签名的打包,编程成apk文件啦!Lucky~

Android开发实践八:点击一个按钮退出整个程序

# 参考资源 #

https://blog.csdn.net/sinat_33921105/article/details/57096554

main.java添加如下代码:

public static List<Activity> activityList = new LinkedList();

public void exit()
{

for(Activity act:activityList)
{
act.finish();
}

System.exit(0);

}
在main.java调用的按钮里添加如下代码:

btn4.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
exit();

}
});
在每个activity的oncreat里面写上如下这么一句代码,记得要写在 setContentView 之后:

Main.activityList.add(this);

 

Android中实现一键退出应用程序

思路
将所有的activity添加到list集合中,通过点击事件对list集合中的activity进行遍历退出,*后应用退出。

Demo图片展示

%title插图%num

实现
创建一个ExitApplication类 对所有Activity的退出进行管理
public class ExitApplication extends Application{
private List<Activity> activityList = new ArrayList<>();
private static ExitApplication instance;

public ExitApplication(){}
public static ExitApplication getInstance(){
if(null == instance){
instance = new ExitApplication();
}
return instance;
}

//添加Activity到容器中
public void addActivity(Activity activity){
//Log.i(“activity”, “size:” + activityList.size());
//Log.i(“activity”, “name:” + activity.getIntent());
activityList.add(activity);
}

//遍历所有Activity并finish
public void exit(){
for(Activity activity : activityList){
//依次关闭
activity.finish();
//Log.i(“activity”, “del_size:” + activityList.size());
//Log.i(“activity”, “del_name:” + activity.getIntent());
}
//强制退出
System.exit(0);
}
}

在MainActivity,SecondActivity等Activity中将Activity添加进集合中(可以将exitActivity()方法抽取到BaseActivity中,在Demo中我抽取到BaseActivity中了)
public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
exitActivity();

private void initView() {
//此处均为findViewById操作,跟主题无关,代码省略
}

private void initData() {
//跟主题无关,代码省略
}

//退出此Acitvity
private void exitActivity() {
ExitApplication.getInstance().addActivity(MainActivity.this);
}
}

在SecondActivity中和此MainActivity中的代码相同。

在有退出按钮的ThirdActivity中,实现点击按钮应用退出操作
public class ThirdActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
initView();
initData();
exitActivity();

private void initView() {
//此处均为findViewById操作,跟主题无关,代码省略
}

private void initData() {
//跟主题无关,代码省略
}

//退出此Acitvity
private void exitActivity() {
ExitApplication.getInstance().addActivity(ThirdActivity.this);
}

//点击按钮退出应用程序 在此按钮属性中设置了onClick = logout
public void logout(View view){
ExitApplication.getInstance().exit();
}
}

 

 

Android Studio安卓开发如何按钮退出程序(所有的Activity)

Android Studio安卓开发如何按钮退出程序(所有的Activity)
只需要一个专门的集合对所有的Activity进行管理
(kotlin版本)

1. 新建一个单例类ActivityCollector作为Activity的集合

/* 单例类ActivityCollector作为Activity的集合,对所有的Activity进行管理 */

object ActivityCollector {
private val activities=ArrayList<Activity>()

/* 用于向ArrayList中添加Activity */
fun addActivity(actity:Activity){
activities.add(actity)
}

/* 用于从ArrayList中移除Activity */
fun removeActivity(actity: Activity){
activities.remove(actity)
}

/* 用于将ArrayList中存储的Activity全部销毁 */
fun finishAll(){
for (activity in activities){
if (!activity.isFinishing){
activity.finish()
}
}
activities.clear()
}
}

2. 新建Class取名BaseActivity,添加代码让其继承AppCompatActivity,并重写onCreat()方法,重写onDestroy()方法

open class BaseActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ActivityCollector.addActivity(this)
}

override fun onDestroy() {
super.onDestroy()
ActivityCollector.removeActivity(this)
}
}

3. 让所有Activity继承BaseActivity,由于BaseActivity继承自AppCompatActivity,所以所有Activity现有功能都不受影响

class MainActivity : BaseActivity()

4. 设置按钮的点击事件,只需调用ActivityCollector的finishAll方法

//退出程序
set_close.setOnClickListener {
ActivityCollector.finishAll()
}

Linux服务器创建流程

前提条件:在root用户权限下操作

一、模板部署场景
1、基本流程
模板部署Linux虚拟机—-配置网络—配置计算机名—配置磁盘—安装深信服EDR—创建普通账户—设置普通账户密码—配置普通账户密码不过期—配置sudoers—ssh禁用root远程登录—修改root密码

2、模板部署Linux虚拟机
按需求以模板部署Linux虚拟机,按配置需求配置虚拟机CPU、内存、磁盘和网络。
注:Linux系统暂提供CentOS 6.9、CentOS 7.6、Oracle Linux 6.9、Oracle Linux 7.6四种模板
在部署中按照需求匹配相应Linux模板,Oracle数据库建议使用Oracle Linux。

3、配置虚拟机网络
部署好虚拟机后,配置IP地址,并通过CRT远程登录虚拟机。

4、配置计算机名
计算机名要求:
计算机名要求简短,其中应用服务器名建议不超过12个字符,数据库服务器名建议不超过8个字符。

5、配置磁盘
分区
fdisk /dev/sda
分完区后重启系统

扩容文件系统
通过远程按需求配置磁盘,如无特殊需求,Linux虚拟机默认把全部剩余空间扩容至/目录
pvcreate /dev/sda3
vgextend vg /dev/sda3
lvextend -l +100%FREE /dev/mapper/vg-root
resize2fs /dev/mapper/vg-root

6、安装深信服EDR
上传linux_edr_installer.tar.gz至/root
mkdir /root/edr
mv /root/linux_edr_installer.tar.gz /root/edr
cd /root/edr
tar -zxvf linux_edr_installer.tar.gz
sh agent_installer.sh
等待安装完成
cd
rm -rf config/ edr/ var/

7、创建普通账户
要求:应用服务器统一创建weblogic用户,数据库服务器统一创建oracle用户
创建weblogic用户
useradd weblogic

创建oracle用户
groupadd oinstall
groupadd dba
useradd -g oinstall -G dba oracle

8、设置普通账户密码
要求:使用密码生成器生成随机密码,密码不小于16位,其中包含大写字母、小写字母、数字、特殊符号。
passwd weblogic   设置weblogic用户密码
passwd oracle     设置oracle用户密码

9、配置普通账户密码不过期
chage -M 99999 weblogic   修改weblogic用户密码过期时间为永不过期
chage -M 99999 oracle     修改oracle用户密码过期时间为永不过期

10、配置sudoers
chmod +w /etc/sudoers    给/etc/sudoers添加写入权限
vi /etc/sudoers
找到root    ALL=(ALL)       ALL这一行
在下面添加一行
weblogic ALL=(ALL)      NOPASSWD:ALL
chmod -w /etc/sudoers    给/etc/sudoers去除写入权限

11、ssh禁用root远程登录
vi /etc/ssh/sshd_config
注释 PermitRootLogin yes
添加
PermitRootLogin no
保存并退出
service sshd restart

12、修改root密码
要求:使用密码生成器生成随机密码,密码不小于16位,其中包含大写字母、小写字母、数字、特殊符号。
passwd

Android studio data目录不能显示的问题

在打开Android studio中打开Android device monitor时,发现data目录不显示其他文件,如图:当我们去点击/data/目录时,发现什么都没有,这是怎么回事呢?原因在于data权限限制访问。解决方法如下:

在这里插入图片描述

1、在Android studio的sdk目录中找到platform-tools目录,在这个目录下同时按住shift和鼠标右键,然后选择“在此处打开命令窗口”或者将sdk下的platform-tools添加到环境变量中,具体怎么配置环境变量我就不介绍了。

在这里插入图片描述

2、输入adb shell命令,然后输入su,使得用户切换到root。(PS:这时是拼手速了,在刚出现generic_x86:/ # ,快速输入su 然后在出现generic_x86:/ # 时快速输入chmod -R 777 /data/,然后回车。
在这里插入图片描述

3、然后将/data/目录的权限改为777(表示任何人都可以访问和修改)。出现以下结果表示权限修改成功
在这里插入图片描述

4、*后我们再刷新一下Android device monitor,发现data目录可以打开了
在这里插入图片描述

在 Linux 上使用 lgsm 搭建饥荒联机服务器

文件结构
主/地上服务器 (Master)

.klei
DoNotStarveTogether
Cluster_1
Master
server.ini
adminlist.txt
cluster_token.txt
cluster.ini
lgsm
config-lgsm
dstserver
dstserver.cfg
serverfiles
mods
dedicated_server_mods_setup.lua
副/地下服务器 (Cases)

.klei
DoNotStarveTogether
Cluster_1
Cases
server.ini
adminlist.txt
cluster_token.txt
cluster.ini
lgsm
config-lgsm
dstserver
dstserver.cfg
serverfiles
mods
dedicated_server_mods_setup.lua
操作流程
对于存档的创建与修改
在自己的计算机上创建一个新的饥荒存档,记得打开所有你需要添加的 mod ,打开洞穴。

创建之后不要选人物,左下角直接离开游戏。找到存档的文件夹(应当在游戏内有打开存档文件夹的按钮),将其中的内容拷贝出来,应该包括:

Master/
Caves/
cluster_token.txt
cluster.ini

我们所要做的就是在同一个服务器的两个用户内分别运行游戏,一个运行 Master 也就是主世界,另外一个运行 Caves 也就是洞穴。要做到这一点,我们就需要把原本在一个文件夹里的 Master 和 Caves 分开,但为了链接它们又需要共同的令牌与设置。按照这个逻辑我们就可以分开它们:

主世界文件夹

Master/
cluster_token.txt
cluster.ini

洞穴文件夹

Master/
cluster_token.txt
cluster.ini

这就要求你保证这两个文件夹的 cluster_token.txt 和 cluster.ini 相同。这里的 cluster.ini 与你刚刚在游戏内创建时的房间设置一致,不必修改。但是 cluster_token.txt 中存放的是游戏服务器的令牌,当前是刚刚创建的房间的令牌,如果不修改则会导致服务器无法上线。因此我们需要重新注册一个服务器令牌。

在饥荒游戏主菜单左下角有账号按钮,点开弹出 klei 官方网站,点上方的 游戏 找到饥荒联机游戏服务器,创建新的服务器,里面的设置无需修改不用关心,直接复制令牌并替换 cluster_token.txt 里的内容即可。

对于服务器文件系统的操作
先切换至在服务器内创建两个用户

adduser master
adduser caves

分别在两个用户内安装 lgsm 并安装饥荒,我这里演示在 master 里操作的流程,对于 caves 是一样的:

su master
cd
wget -O linuxgsm.sh https://linuxgsm.sh && chmod +x linuxgsm.sh && bash linuxgsm.sh dstserver
./dstserver install

如果在安装中遇到 raw.githubusercontent.com 连接不上的问题可以在系统的 etc/hosts 里加上一行 199.232.4.133 raw.githubusercontent.com 再重试(或者重启)。

安装完全完成以后,需要修改 lgsm 启动项,进入 lgsm/config-lgsm/dstserver ,将 _default.cfg 里的内容粘贴进 dstserver.cfg 里,并修改这几行:

## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
sharding=”true”
master=”true”
shard=”Master”
cluster=”Cluster_1″
cave=”false”

注意,上面这段代码是 master 用户里的设置, caves 用户则与其不同,应当这样设置:

## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
sharding=”false”
master=”false”
shard=”Caves”
cluster=”Cluster_1″
cave=”true”

改完启动项,我们需要将存档分别放入对应的服务器内。进入 .klei/DoNotStarveTogether/Cluster_1 文件夹(注意:这个文件夹默认是隐藏的!),然后删除里面的所有内容,将上边分好的存档分别放入。master 用户里放 Master 存档, caves 用户里放 Caves 存档。

*后一步也是比较困难的一步:修改 mod 配置文件。进入 serverfiles/mods ,打开 dedicated_server_mods_setup.lua 文件,将自己存档里用到的 mod 以这种格式添加进文件:

ServerModSetup(“1271089343”)
ServerModSetup(“1898181913”)
ServerModSetup(“2078243581”)

每一行里的数字对应一个 mod,这个编号可以从该 mod 创意工坊的链接末尾获得,也可以在你的存档文件里找到。打开 Master/modoverrides.lua ,这里会列出所有存档里加载的 mod 的设置。我截取以下片段作为例子:

[“workshop-1185229307”]={
configuration_options={ damage=2, noepic=false, phase=true, range=20, timeout=10 },
enabled=true
},

这里的 1185229307 就是该 mod 对应的编号,将这个编号以上述的 ServerModeSetup(“**********”) 添加即可。存档里用到的所有 mod 都要添加;master 和 caves 用户都需要添加。

*后一项操作可选:配置服务器管理员。服务器管理员可以执行控制服务器的指令,包括 T 键模组 也需要使用者拥有管理员权限。

饥荒里每一位玩家都有独一无二的编号标识。自己的编号可以在饥荒游戏主菜单左下角的 账户 里找到,是一个格式为 KU_******** 的编号。

打开 Master/adminlist.txt 将编号添加进去即可,Caves/adminlist.txt 同理

完成了这些所有的配置基本就绪。接下来就可以尝试启动服务器了。

游戏服务器操作
先切换 master 用户进行操作:

cd
./dstserver start
./dstserver console

这里有两个操作,start 是启动服务器, console 是在 shell 里显示控制台,这样就可以查看服务器是否成功启动。如果*后看到如下内容,说明基本成功:

[**:**:**]Sim Paused
[**:**:**]Registering master server in *** lobby

此时可以另开一个 shell 窗口,切换 caves 用户,同样如此:

cd
./dstserver start
./dstserver console

待 caves 完全启动,观察 master 的控制台是否有链接到 caves 的输出信息,如果有的话,服务器就基本搭建完成了。这时候两个窗口都可以使用 Ctrl + B 再按 D 的方式安全退出控制台,这时候就可以关闭窗口了。如果要停止服务器,则分别输入 ./dstserver stop 即可。

在游戏中想要快速连接到服务器,可以按 ~ 键进入游戏内控制台,输入 c_connect(“服务器地址”)。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速