在阿里云ECS上搭建Skynet服务器与Unity通信

在阿里云ECS上搭建Skynet服务器与Unity通信

    • 创建阿里云ECS实例
    • Skynet搭建
    • 服务端代码部分
    • 客户端部分(Unity)

创建阿里云ECS实例

这部分的话按照阿里云流程去做就可以了。也可以使用谷歌云或者其他的云VPS。

Skynet搭建

Ubuntu下的环境搭建(其他系统下并未尝试):

  1. 升级软件源

sudo apt-get update

  1. 安装git

apt-get install git

  1. clone Skynet到ECS上,我的安装位置是在 /home/server下

git clone https://github.com/cloudwu/skynet.git

  1. 安装autoconf apt-get install libreadline-dev autoconf

apt-get install libreadline-dev autoconf

  1. 编译skynet

cd skynet
make linux

服务端代码部分

  1. 在skynet根目录创建myServer文件

mkdir myServer

  1. 创建3个文件 config main.lua socket.lua

touch config
touch main.lua
touch socket.lua

config文件

root = "./"
thread = 8
logger = nil
harbor = 1
address = "127.0.0.1:2526"
master = "127.0.0.1:2013"
start = "main"  -- main script
bootstrap = "snlua bootstrap"   -- The service for bootstrap
standalone = "0.0.0.0:2013"
luaservice = root.."service/?.lua;"..root.."test/?.lua;"..root.."myServer/?.lua"
lualoader = "lualib/loader.lua"
snax = root.."examples/?.lua;"..root.."test/?.lua"
cpath = root.."cservice/?.so"

main.lua文件

local skynet = require "skynet"

-- 启动服务(启动函数)
skynet.start(function()
    -- 启动函数里调用Skynet API开发各种服务
    print("======Server start=======")

    skynet.newservice("socket")
    skynet.exit()
end)

socket.lua 文件,此处特别注意监听的ip必须是阿里云的私有ip,端口号需要在阿里云设置中进行开启入规则端口


local skynet = require "skynet"
local socket = require "skynet.socket"

-- 读取客户端数据, 并输出
local function echo(id)
    -- 每当 accept 函数获得一个新的 socket id 后,并不会立即收到这个 socket 上的数据。这是因为,我们有时会希望把这个 socket 的操作>权转让给别的服务去处理。
    -- 任何一个服务只有在调用 socket.start(id) 之后,才可以收到这个 socket 上的数据。
    socket.start(id)

    while true do 
        -- 读取客户端发过来的数据 
        local str = socket.read(id)
        if str then 
            -- 直接打印接收到的数据
            print(str)
        else
            socket.close(id)
            return
        end
    end
end 
    
skynet.start(function() 
    print("==========Socket1 Start=========")
    -- 监听一个端口,返回一个 id ,供 start 使用。
    local id = socket.listen("xxx.xx.xx.xxx", xxxx)
    print("Listen socket :", "xxx.xx.xx.xxx", xxxx)

    socket.start(id , function(id, addr)
            -- 接收到客户端连接或发送消息()
            print("connect from " .. addr .. " " .. id)

            -- 处理接收到的消息
            echo(id)

        end)
    --可以为自己注册一个别名。(别名必须在 32 个字符以内)
    -- skynet.register "SOCKET"
end)

这里很重要的一点是阿里云的ECS实例上的telnet是连接不通自己的回环地址127.0.0.1的
必须安装telnet的配置才能够访问。也就是说没有安装telnet外网也无法通过socket连接至阿里云上的服务器。

sudo apt-get install xinetd telnetd
vim /etc/inetd.conf

telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd

vim /etc/xinetd.conf

Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
# Please note that you need a log_type line to be able to use log_on_success
# and log_on_failure. The default is the following :
# log_type = SYSLOG daemon info
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}

sudo /etc/init.d/xinetd restart

最后尝试

telnet 127.0.0.1

出现成功连接标志则可以外网成功连接了。

之后前往skynet根目录创建bash文件run.sh

touch run.sh

#!/bin/bash

./skynet ./myServer/config

并且在根目录

sh run.sh

开启服务器监听

客户端部分(Unity)

创建一个C#脚本

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
 
public class NetWorkScript : MonoBehaviour
{
    private byte[] data = new byte[1024];
    private Socket clientSocket;
    private Thread receiveT;
 
	void Start ()
    {
        ConnectToServer();
    }
 
    void ConnectToServer()
    {
        try
        {
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.Connect("xxx.xx.xx.xxx", xxxx);
            SendMes("hello world!");
            Debug.Log("连接服务器成功");
            receiveT = new Thread(ReceiveMsg);
            receiveT.Start();
 
        }
        catch (System.Exception ex)
        {
            Debug.Log("连接服务器失败!");
            Debug.Log(ex.Message);
        }
    }
 
    private void ReceiveMsg()
    {
        while (true)
        {
            if (clientSocket.Connected == false)
            {
                Debug.Log("与服务器断开了连接");
                break;
            }
 
            int lenght = 0;
            lenght = clientSocket.Receive(data);
 
            string str = Encoding.UTF8.GetString(data, 0, data.Length);
            Debug.Log(str);
            
        }
    }
    
    void SendMes(string ms)
    {
        byte[] data = new byte[1024];
        data = Encoding.UTF8.GetBytes(ms);
        clientSocket.Send(data);
    }
    
    void OnDestroy()
    {
        try
        {
            if (clientSocket != null)
            {
                clientSocket.Shutdown(SocketShutdown.Both);
                clientSocket.Close();//关闭连接
            }
 
            if (receiveT != null)
            {
                receiveT.Interrupt();
                receiveT.Abort();
            }
 
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }
    }
}

挂载到随便某个物体上,运行测试,这边注意连接的ip是阿里云公网ip
测试成功截图:
客户端客户端成功
服务端服务端成功

你可能感兴趣的:(在阿里云ECS上搭建Skynet服务器与Unity通信)