【Unity3D】 FTP与MQTT服务器搭建
前言
前些时间项目需要使用Unity3d做一套能够和FTP服务器与MQTT服务器共同搭建的项目,期间遇到了不少坑,由于以前没怎么做过后端服务器的搭建,这次也就相当于是给自己一次学习的记录吧。
项目准备
1.Unity3D
unity3D 是一款比较好用的商用游戏引擎,使用C#语言,是目前比较流行的商用游戏引擎。
官网下载链接有点迷,其自带的Unity Hub总感觉有些问题,建议去官方归档地址下载。
这个项目我使用的版本是Unity 2018.2.15f1。
装好Unity程序之后我们就可以进行后一步的操作了
2.云服务器
去阿里云或是腾讯云官网购买一个服务器就行了,安装的是Ubuntu操作系统。
3.远程连接
我这里用的Putty,因为云服务器是由另一方开发人员管理的,拿到他们给我的公网IP和账户密码后,用Putty进行远程连接操作即可。
4.端口扫描
因为老是遇到本地端口可以访问,但通过公网IP无法访问的问题。所以使用这个端口扫描来检查是不是自己的端口没有暴露出去。一般遇到公网IP无法访问到这种问题主要是一下几种情况(这些都是我遇到过的问题)
- 云服务器控制台没有打开端口,这种情况下端口扫描基本都是关闭的状况,这个联系管理员打开端口就行了。
- 另一种情况则是因为服务器的防火墙把端口禁掉了,使用iptables,把它放开允许访问就行了。
- 还有可能就是你服务器运行所需要的端口被其他进程占用了,不过这种情况下往往服务器程序应该也会报错的,使用下端口查询的命令看看端口被占用情况,使用类似kill的命令杀掉这些占用端口的程序然后再启动。
- 最后一个就是配置文件里面,往往是形如“127.0.0.1:port”,这种格式外网是无法访问到此端口的,因为它仅仅监听环回接口的数据,即本机发送给本机port端口的数据,其他主机发送过来的数据无法接收到,因此这种情况你需要把其改为"0.0.0.0:port"这种形式,它表示监听所有的网络接口数据,包括环回接口和其他网络接口,所有本机和其他主机发送的数据都可以接受到。
在排除这些问题之后,理论上你使用端口扫描工具,这些端口应该都是开放状态的。(如下方打开状态的端口),如果还有关闭的状态请重新检查下上述情况 。
FTP服务器搭建与连接
1.FTP服务器——vsftpd
vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持很多其他的 FTP 服务器不支持的特征。这里我选择这个服务器进行搭建,在Ubuntu终端上使用相关程序命令进行安装,并按照相关教程进行配置,这里我参考的是这篇博客。注意FTP服务器的连接端口是21端口,按照上面提到的端口解决方案,保证21端口是暴露出来的,在配置完成后,在chrome浏览器中输入ftp://xxx.xxx.xx.xx就应该可以进入ftp服务器的根目录了,注意浏览器栏中默认协议是http,所以输入时一定要手动输入ftp,不然无法访问到FTP服务器。
2.Unity3d连接FTP服务器
unity连接FTP服务器的方式很简单:
/// <summary>
/// 创建FTP服务器连接
/// </summary>
/// <param name="url">FTP服务器地址</param>
/// <param name="requestMethod">FTP服务器请求方法</param>
/// <returns></returns>
private FtpWebRequest CreatFtpWebRequest(string url, string requestMethod)
{
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(url);
request.Credentials = networkCredential;
request.KeepAlive = true;
request.UseBinary = true;
request.Method = requestMethod;
return request;
}
其中,request.Credentials是用于验证用户身份的,使用形如
networkCredential = new NetworkCredential("账户名", "账户密码");
即可建立FTP连接,如果希望支持匿名访问的话,去vsftpd服务器的config文件里面将相关的设置为true即可。
然后你就可以通过形如:
FtpWebRequest request = CreatFtpWebRequest(url, WebRequestMethods.Ftp.ListDirectoryDetails);
FtpWebRequest request= CreatFtpWebRequest(url, WebRequestMethods.Ftp.GetFileSize);
FtpWebRequest request = CreatFtpWebRequest(url, WebRequestMethods.Ftp.DownloadFile);
FtpWebRequest request = CreatFtpWebRequest(url, WebRequestMethods.Ftp.UploadFile);
的方式创建ftp连接,其由上而下分别是获取文件列表方法,获取文件大小方法(可以用于制作进度条),文件下载方法和文件上传方法,这些都是C#支持的方法,直接使用这些方法建立传输连接并使用即可,此处我贴出我的几个方法实现:
- 连接FTP服务器并遍历返回的结果,后面略微有些复杂的逻辑是对ftp返回的字符串格式进行的处理,各位可以通过查看网络流数据内容的方式后自定义对结果字符串的处理结果。
/// <summary>
/// 展示FTP连接后的遍历结果
/// </summary>
/// <param name="url">FTP服务器地址路径</param>
/// <returns>是否连接上FTP服务器</returns>
private bool ShowFtpFileAndDirectory(string url)
{
try
{
FtpWebRequest request = CreatFtpWebRequest(url, WebRequestMethods.Ftp.ListDirectoryDetails);