Linux搭建 Minecraft 服务器

Linux搭建 Minecraft 服务器本篇文章介绍使用常规方式和docker容器方式在linux操作系统上搭建最新版本的minecraft服务器,并使用bungeecord配置为群组服务器模式。

大家好,又见面了,我是你们的朋友全栈君。

1、Minecraft简介

Minecraft《我的世界》是由 Mojang Studios 公司开发的一款生存沙盒游戏。

在这里插入图片描述

Minecraft 由瑞典视频游戏程序员和设计师 Markus Alexej Persson 使用Java编程语言创建。
在这里插入图片描述

Minecraft 于 2009 年 5 月首次公开,然后在 2011 年 11 月完全发布,Minecraft 此后已被移植到其他多个平台,并且成为有史以来最畅销的视频游戏。2014 年,Mojang 和 Minecraft 的知识产权被微软以25 亿美元的价格收购。

在《我的世界》中,玩家探索一个程序生成的块状 3D 世界,几乎无限的地形,并能够发现和开采原材料、制作工具和物品,并建造结构、土方工程和简单的机器。根据游戏模式,玩家可以与电脑控制的小怪战斗,以及与同一世界的其他玩家合作或竞争。

游戏模式包括玩家必须获取资源来建造世界并能够生存下去的生存模式,以及玩家拥有无限资源和飞行的创造模式。玩家可以修改游戏,以创造新的游戏机制、物品和资产。

游戏分为国际pe基岩版,以及官方正版pc版,常称java版,游戏的Java版以其强大的第三方拓展模组(Forge / Fabric / Liteloader mod)而知名,它们可以为游戏添加各种新的对象、角色和功能。

官方网站:https://minecraft.net

2、搭建环境选择

Minecraft 服务器端可以是 Windows 或 Linux,Windows 更适用于不熟悉Linux命令的服主,但自带图形窗口的windows对服务器cpu内存资源有一定消耗,因此对于资深的 linux 服务器玩家linux才是更好的选择。

下面准备一台linux服务器,配置2核CPU、8G内存,发行版本选择Ubuntu、Debain、CentOS等,推荐使用Ubuntu Server,如果需要通过互联网访问还需要购买1个公网IP地址,推荐按量付费宽带,可根据需要购买一个域名,绑定到公网IP。

关于云服务器,可选国内三大云厂商阿里云腾讯云华为云,不过价格过于昂贵,性能要求不高可以购买他们的轻量应用服务器类型,其他VPS云厂商也数不胜数,比如淘宝搜索Minecraft服务器,购买面板服,如果只是本地测试则更简单,可以使用 VMware WorkstationVirtualbox 创建虚拟机。

本篇文章介绍在Linux系统上搭建Minecraft服务端,以及如何使用bungeecord配置为群组模式,本文采用传统的应用部署方式,方便熟悉minecraft服务器端的部署原理和流程,但当前 docker 容器技术大行其道,更推荐使用 docker,能够仅用一条命令几分钟搭建起一个服务端。

docker容器方式搭建请移步:https://blog.csdn.net/networken/article/details/84945172

3、服务器基本配置

服务器准备就绪后,执行以下操作,做一些初始化配置,操作系统版本:Ubuntu Server 22.04 LTS

1、首先需要使用SSH工具连接到服务器,下载ssh连接工具 tabbyxshell ,以xshell为例,勾选两者,下载安装Xshell和Xftp。

在这里插入图片描述

新建ssh连接,输入服务器IP地址,点击连接输入用户名及密码,登录到命令行界面:

在这里插入图片描述

2、修改服务器主机名,执行exit命令退出重新连接使配置生效

root@ubuntu:~# hostnamectl set-hostname mcserver

在这里插入图片描述

3、创建名为mc的用户组及用户,指定home目录设置为/opt/minecraft,方便使用普通用户管理minecraft

groupadd -r mc
useradd -r -g mc -d "/opt/minecraft" -s "/bin/bash" -m mc

为mc用户设置密码123456

echo "mc:123456" | sudo chpasswd

# 或使用passwd命令交互式设置
passwd mc

为mc用户配置sudo免密

tee /etc/sudoers.d/mc <<< 'mc ALL=(ALL) NOPASSWD: ALL'
chmod 440 /etc/sudoers.d/mc

4、切换到普通用户mc,或退出直接使用该用户ssh登录

root@mcserver:~# su - mc

查看当前所在目录

mc@mcserver:~$ pwd
/opt/minecraft

5、配置使用systemctl命令管理minecraft服务

loginctl enable-linger $(whoami)
echo "export XDG_RUNTIME_DIR=/run/user/$(id -u)" >> ~/.bashrc
source ~/.bashrc

将mc用户加入systemd-journal组增加日志查看权限

sudo usermod -a -G systemd-journal mc

6、minecraft服务端依赖java环境,安装java环境,以openjdk为例:

sudo apt update -y
sudo apt install -y openjdk-17-jdk

确认安装成功

mc@mcserver:~$ java --version
openjdk 17.0.3 2022-04-19
OpenJDK Runtime Environment (build 17.0.3+7-Ubuntu-0ubuntu0.22.04.1)
OpenJDK 64-Bit Server VM (build 17.0.3+7-Ubuntu-0ubuntu0.22.04.1, mixed mode, sharing)

4、搭建单个服务端

无特殊说明后续所有操作都以普通用户mc身份执行

1、创建服务端安装目录

mc@mcserver:~$ mkdir -p ~/{ 
   jars,instances}

2、下载服务端jar包,下载地址:https://mcversions.net/,选择STABLE RELEASE稳定正式版本,以1.19为例:

在这里插入图片描述

下载后使用 xftp或 winscp工具上传到服务器/opt/minecraft/jars目录下,也可以获取下载链接后直接使用命令下载:

wget https://launcher.mojang.com/v1/objects/e00c4052dac1d59a1188b2aa9d5a87113aaf1122/server.jar -P ~/jars

如果本地上传需要确认jar包权限属于是否mc用户,否则需要执行以下命令修改权限:

sudo chown -R mc:mc ~/jars/server.jar

3、创建minecraft服务启动文件,复制粘贴以下内容到命令行

mkdir -p ~/.config/systemd/user/
cat >~/.config/systemd/user/minecraft@.service<<'EOF' [Unit] Description=Minecraft Server %i Wants=network.target After=network.target [Service] Type=simple WorkingDirectory=/opt/minecraft/instances/%i ExecStart=/usr/bin/java -Xms2G -Xmx4G -jar /opt/minecraft/jars/server.jar nogui RestartSec=30 Restart=on-failure KillMode=process KillSignal=SIGINT SuccessExitStatus=130 StandardInput=null [Install] WantedBy=default.target EOF

4、启动minecraft服务端

mkdir -p ~/instances/survival
echo "eula=true" > /opt/minecraft/instances/survival/eula.txt
systemctl --user daemon-reload
systemctl --user enable minecraft@survival
systemctl --user start minecraft@survival

查看服务运行状态,等待服务端完全启动

mc@mcserver:~$ systemctl --user status minecraft@survival.service 
● minecraft@survival.service - Minecraft Server survival
     Loaded: loaded (/opt/minecraft/.config/systemd/user/minecraft@.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-06-09 20:58:12 CST; 9min ago
   Main PID: 5402 (java)
      Tasks: 25 (limit: 4538)
     Memory: 2.8G
        CPU: 2min 54.030s
     CGroup: /user.slice/user-998.slice/user@998.service/app.slice/app-minecraft.slice/minecraft@survival.service
             └─5402 /usr/bin/java -Xms2G -Xmx4G -jar /opt/minecraft/jars/server.jar nogui

Jun 09 20:59:44 mcserver java[5402]: [20:59:44] [Worker-Main-7/INFO]: Preparing spawn area: 60%
Jun 09 20:59:46 mcserver java[5402]: [20:59:46] [Worker-Main-7/INFO]: Preparing spawn area: 72%
Jun 09 20:59:46 mcserver java[5402]: [20:59:46] [Worker-Main-7/INFO]: Preparing spawn area: 72%
Jun 09 20:59:46 mcserver java[5402]: [20:59:46] [Worker-Main-7/INFO]: Preparing spawn area: 72%
Jun 09 20:59:46 mcserver java[5402]: [20:59:46] [Worker-Main-7/INFO]: Preparing spawn area: 72%
Jun 09 20:59:47 mcserver java[5402]: [20:59:47] [Worker-Main-7/INFO]: Preparing spawn area: 88%
Jun 09 20:59:47 mcserver java[5402]: [20:59:47] [Worker-Main-7/INFO]: Preparing spawn area: 88%
Jun 09 20:59:47 mcserver java[5402]: [20:59:47] [Worker-Main-7/INFO]: Preparing spawn area: 88%
Jun 09 20:59:50 mcserver java[5402]: [20:59:50] [Server thread/INFO]: Time elapsed: 66705 ms
Jun 09 20:59:50 mcserver java[5402]: [20:59:50] [Server thread/INFO]: Done (85.783s)! For help, type "help"

5、管理服务启停命令

# 重新加载配置
systemctl --user daemon-reload

# 启动服务端
systemctl --user start minecraft@survival

# 停止服务端
systemctl --user stop minecraft@survival

# 重启服务端
systemctl --user restart minecraft@survival

# 查看服务运行状态
systemctl --user status minecraft@survival

# 查看服务启动日志
journalctl -f

5、客户端登录server端

官方客户端下载地址:https://minecraft.net/zh-hans/download/

这里选择使用第三方客户端HMCL,下载地址:https://hmcl.huangyuhui.net/

本地选择一个目录解压安装即可,安装完成以后需要执行两个操作:添加游戏账户、下载游戏版本。

在这里插入图片描述

1、点击添加账户,如果已购买游戏选择微软账户或Mojang账户,否则选择离线模式

在这里插入图片描述
这里采用离线模式,添加一个本地用户,用户名自定义,在高级设置中可以查看到默认生成的UUID:

在这里插入图片描述

注意,采用离线模式,需要修改服务端配置文件,关闭online-mode,找到以下选项改为false

mc@mcserver:~$ vim instances/survival/server.properties 
...
online-mode=false
...

重启服务端使配置生效

systemctl --user restart minecraft@survival

2、返回客户端首页,点击下载,点击一个游戏版本进行安装,与服务端版本一致

在这里插入图片描述
3、账号和游戏版本准备好后,返回客户端首页,点击启动游戏

在这里插入图片描述
选择多人游戏

在这里插入图片描述
点击添加服务器

在这里插入图片描述
输入服务器名称和服务器地址,名称可自定义,服务器地址可以是公网IP地址或域名:
在这里插入图片描述
完成后可以看到已成功添加服务器
在这里插入图片描述

点击列表成功登入服务器,执行/list命令可以显示在线的玩家
在这里插入图片描述
查看服务器后端日志,有 steve 用户登录记录

mc@mcserver:~$ journalctl -f
Jun 09 21:19:44 mcserver java[5581]: [21:19:44] [Worker-Main-1/INFO]: Preparing spawn area: 4%
Jun 09 21:19:45 mcserver java[5581]: [21:19:45] [Server thread/INFO]: Time elapsed: 7130 ms
Jun 09 21:19:45 mcserver java[5581]: [21:19:45] [Server thread/INFO]: Done (20.208s)! For help, type "help"
Jun 09 21:20:45 mcserver java[5581]: [21:20:45] [Server thread/INFO]: steve[/192.168.93.229:10391] logged in with entity id 110 at (-28.5, 70.0, -29.5)
Jun 09 21:20:45 mcserver java[5581]: [21:20:45] [Server thread/INFO]: steve joined the game
Jun 09 21:20:51 mcserver java[5581]: [21:20:51] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 2017ms or 40 ticks behind
Jun 09 21:21:54 mcserver java[5581]: [21:21:54] [Server thread/INFO]: steve lost connection: Disconnected
Jun 09 21:21:54 mcserver java[5581]: [21:21:54] [Server thread/INFO]: steve left the game
Jun 09 21:44:37 mcserver java[5581]: [21:44:37] [Server thread/INFO]: steve[/192.168.93.229:6745] logged in with entity id 410 at (-34.35809642546795, 63.0, -0.6483614176174147)
Jun 09 21:44:37 mcserver java[5581]: [21:44:37] [Server thread/INFO]: steve joined the game

6、配置ops权限

可以通过修改ops.json文件为用户添加ops权限,添加前需要获取用户名称及UUID,在线用户可以通过https://namemc.com/这个网站查看某个用户的UUID,离线模式可以在创建用户时高级模式中查看,或在服务端 usercache.json 文件中查看已登录到服务器的用户UUID

1、服务端查看离线用户的UUID

mc@mcserver:~$ cat ~/instances/survival/usercache.json 
[{ 
   "name":"steve","uuid":"53909932-f794-33c0-9329-948045a4c1ce","expiresOn":"2022-07-09 21:44:37 +0800"}]

2、配置 ops.json 文件,将用户steve设为op

mc@mcserver:~$ vim instances/survival/ops.json 
[
  { 
   
    "uuid": "53909932-f794-33c0-9329-948045a4c1ce",
    "name": "steve",
    "level": 4
  }
]

重启服务端使配置生效

systemctl --user restart minecraft@survival

重新使用客户端登录,执行/op steve提示该steve用户已经是管理员,如果需要取消管理员权限执行/deop steve命令:
在这里插入图片描述

op具有很高权限,比如可以修改游戏模式为创造模式,可以使用任何方块和飞行等等:

/gamemode creative

双击空格我们的steve就可以起飞了:
在这里插入图片描述

7、搭建群组服务器

下面我们使用bungeecord代理软件搭建由多个服务端组成的群组服务器,这里仅仅进行测试,BC代理软件和所有子服全部运行在一台服务器上。

其架构原理如下图所示:
在这里插入图片描述

1、目前已经创建了生存服,在启动一个lobby登录服

mkdir -p ~/instances/lobby
echo "eula=true" > /opt/minecraft/instances/lobby/eula.txt
systemctl --user enable minecraft@lobby
systemctl --user start minecraft@lobby

由于在同一台服务器启动多个服务端,默认端口25565已被占用导致启动失败,需要修改lobby服务端端口号,修改以下两项

mc@mcserver:~$ vim instances/lobby/server.properties
...
online-mode=false
...
server-port=25566
...

重新启动lobby服务端

systemctl --user restart minecraft@lobby

等待服务端完全启动

mc@mcserver:~$ systemctl --user status minecraft@lobby.service 
● minecraft@lobby.service - Minecraft Server lobby
     Loaded: loaded (/opt/minecraft/.config/systemd/user/minecraft@.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-06-09 22:56:32 CST; 2min 15s ago
   Main PID: 6343 (java)
      Tasks: 25 (limit: 4538)
     Memory: 1.9G
        CPU: 1min 6.759s
     CGroup: /user.slice/user-998.slice/user@998.service/app.slice/app-minecraft.slice/minecraft@lobby.service
             └─6343 /usr/bin/java -Xms2G -Xmx4G -jar /opt/minecraft/jars/server.jar nogui

Jun 09 22:57:06 mcserver java[6343]: [22:57:06] [Worker-Main-1/INFO]: Preparing spawn area: 0%
Jun 09 22:57:06 mcserver java[6343]: [22:57:06] [Worker-Main-1/INFO]: Preparing spawn area: 0%
Jun 09 22:57:06 mcserver java[6343]: [22:57:06] [Worker-Main-1/INFO]: Preparing spawn area: 0%
Jun 09 22:57:06 mcserver java[6343]: [22:57:06] [Worker-Main-1/INFO]: Preparing spawn area: 0%
Jun 09 22:57:06 mcserver java[6343]: [22:57:06] [Worker-Main-1/INFO]: Preparing spawn area: 0%
Jun 09 22:57:07 mcserver java[6343]: [22:57:07] [Worker-Main-1/INFO]: Preparing spawn area: 0%
Jun 09 22:57:07 mcserver java[6343]: [22:57:07] [Worker-Main-1/INFO]: Preparing spawn area: 0%
Jun 09 22:57:08 mcserver java[6343]: [22:57:08] [Worker-Main-1/INFO]: Preparing spawn area: 54%
Jun 09 22:57:08 mcserver java[6343]: [22:57:08] [Server thread/INFO]: Time elapsed: 10855 ms
Jun 09 22:57:08 mcserver java[6343]: [22:57:08] [Server thread/INFO]: Done (24.147s)! For help, type "help"

客户端添加服务器登录验证,非默认端口时需要添加端口号
在这里插入图片描述

2、下载bungeecord jar包到本地,bungeecord代理端下载地址:https://ci.md-5.net/job/BungeeCord/

点击右侧BungeeCored.jar,下载并上传到服务器
在这里插入图片描述
这里在官网获取下载链接,直接下载到linux对应目录下:

wget https://ci.md-5.net/job/BungeeCord/lastSuccessfulBuild/artifact/bootstrap/target/BungeeCord.jar -P ~/jars/

3、创建BungeeCord服务启动文件,复制粘贴以下内容到命令行

cat >~/.config/systemd/user/bungeecord.service<<'EOF' [Unit] Description=bungeecord Server Wants=network.target After=network.target [Service] Type=simple WorkingDirectory=/opt/minecraft/instances/bungeecord ExecStart=/usr/bin/java -Xms2G -Xmx4G -jar /opt/minecraft/jars/BungeeCord.jar nogui RestartSec=30 Restart=on-failure KillMode=process KillSignal=SIGINT SuccessExitStatus=130 StandardInput=null [Install] WantedBy=default.target EOF

4、启动BungeeCord服务端

mkdir -p ~/instances/bungeecord
systemctl --user daemon-reload
systemctl --user enable bungeecord.service
systemctl --user start bungeecord.service

查看服务运行状态,等待服务端完全启动

mc@mcserver:~$ systemctl --user status bungeecord.service 
● bungeecord.service - bungeecord Server
     Loaded: loaded (/opt/minecraft/.config/systemd/user/bungeecord.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-06-09 23:11:38 CST; 19s ago
   Main PID: 6809 (java)
      Tasks: 25 (limit: 4538)
     Memory: 127.3M
        CPU: 2.473s
     CGroup: /user.slice/user-998.slice/user@998.service/app.slice/bungeecord.service
             └─6809 /usr/bin/java -Xms2G -Xmx4G -jar /opt/minecraft/jars/BungeeCord.jar nogui

Jun 09 23:11:43 mcserver java[6809]: [104B blob data]
Jun 09 23:11:43 mcserver java[6809]: [104B blob data]
Jun 09 23:11:43 mcserver java[6809]: [57B blob data]
Jun 09 23:11:43 mcserver java[6809]: [117B blob data]
Jun 09 23:11:43 mcserver java[6809]: [105B blob data]
Jun 09 23:11:43 mcserver java[6809]: [109B blob data]
Jun 09 23:11:43 mcserver java[6809]: [107B blob data]
Jun 09 23:11:43 mcserver java[6809]: [105B blob data]
Jun 09 23:11:43 mcserver java[6809]: [105B blob data]
Jun 09 23:11:43 mcserver java[6809]: [45B blob data]

5、修改BungeeCord配置文件,改动配置项如下,其他默认即可:

mc@mcserver:~$ vim instances/bungeecord/config.yml 
listeners:
......
online_mode: false
......
servers:
  lobby:
    motd: '&1Just another BungeeCord - Forced Host'
    address: localhost:25566
    restricted: false
  survival:
    motd: '&1Just another BungeeCord - Forced Host'
    address: localhost:25565
    restricted: false

重新启动服务

systemctl --user restart bungeecord.servie

6、客户端添加服务器验证
在这里插入图片描述

登录后执行/server命令,将提示你当前所在的服务器,执行/server survival将切换到survival服务器

在这里插入图片描述

查看此时的数据目录结构:

mc@mcserver:~$ sudo apt install -y tree

mc@mcserver:~$ tree -L 3 /opt/minecraft/
/opt/minecraft/
├── instances
│   ├── bungeecord
│   │   ├── config.yml
│   │   ├── locations.yml
│   │   ├── modules
│   │   ├── modules.yml
│   │   ├── plugins
│   │   ├── proxy.log.0
│   │   └── proxy.log.0.lck
│   ├── lobby
│   │   ├── banned-ips.json
│   │   ├── banned-players.json
│   │   ├── crash-reports
│   │   ├── eula.txt
│   │   ├── libraries
│   │   ├── logs
│   │   ├── ops.json
│   │   ├── server.properties
│   │   ├── usercache.json
│   │   ├── versions
│   │   ├── whitelist.json
│   │   └── world
│   └── survival
│       ├── banned-ips.json
│       ├── banned-players.json
│       ├── eula.txt
│       ├── libraries
│       ├── logs
│       ├── ops.json
│       ├── server.properties
│       ├── usercache.json
│       ├── versions
│       ├── whitelist.json
│       └── world
└── jars
    ├── BungeeCord.jar
    └── server.jar

16 directories, 21 files

查看当前服务器列表
在这里插入图片描述
以上就是单个服务器及群组服务器的基本搭建方法,在实际搭建时仍有很多参数和配置需要调整,以及不计其数的插件集成。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150627.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 为什么hashmap线程不安全我们还要用_arraylist线程不安全体现在哪里

    为什么hashmap线程不安全我们还要用_arraylist线程不安全体现在哪里一、Map概述我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有map中确实属于比较高的。因为它可以满足我们大多数的场景了。Map类继承图上面展示了java中Map的继承图,Map是一个接口,我们常用的实现类有HashMap、LinkedHashMap、TreeMap,HashTable。HashMap根据key的hashCode值来保存value,需要注意的是,HashMap不保证遍历的顺序和插入的顺序是一致的。HashMap允许有一条记录的key为null,但

    2022年10月11日
  • 11种经典滤波算法「建议收藏」

    11种经典滤波算法「建议收藏」1、限幅滤波法(又称程序判断滤波法)  A、方法:      根据经验判断,确定两次采样允许的最大偏差值(设为A)      每次检测到新值时判断:      如果本次值与上次值之差&lt;=A,则本次值有效      如果本次值与上次值之差&gt;A,则本次值无效,放弃本次值,用上次值代替本次值  B、优点:      能有效克服因偶然因素引起的脉冲干扰…

  • Python – __name__==’__main__’是干啥的,以及python -m与python的区别

    Python – __name__==’__main__’是干啥的,以及python -m与python的区别转自牛人: https://www.cnblogs.com/ddzj01/p/10919210.html1.__name__=='__main__'是干啥的先看例子,准

  • 微信小程序反编译工具wxappUnpacker使用

    1、下载wxappUnpacker,我这里用的是node版还有其他班自己查https://github.com/qwerty472123/wxappUnpacker2、下载node。js首先需要知道的是小程序在手机里的文件储存位置——那么这个位置具体在哪呢?————具体目录位置:/data/data/com.tencent.mm/MicroMsg/{{一串32位的16进制…

  • JVM: GC过程总结(minor GC 和 Full GC)「建议收藏」

    一minorGC和FullGC区别新生代GC(MinorGC):指发生新生代的的垃圾收集动作,MinorGC非常频繁,回收速度一般也比较快。老年代GC(MajorGC/FullGC):指发生在老年代的GC,出现了MajorGC经常会伴随至少一次的MinorGC(并非绝对),MajorGC的速度一般会比MinorGC的慢10倍以上。二minorGC过程详解1在初始阶段,新创建的对象被分配到Eden区,survivor的两块空间都为空。

  • Json交互处理_stata交互项检验

    Json交互处理_stata交互项检验Json交互处理JSON简介JSON(JavaScriptObjectNotation,JS对象标记)是一种轻量级的数据交换格式,目前使用特别广泛。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。在JavaScript语言中,一切都是对象。因此,任何JavaScript支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。看看他

    2022年10月15日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号