这部分的话按照阿里云流程去做就可以了。也可以使用谷歌云或者其他的云VPS。
Ubuntu下的环境搭建(其他系统下并未尝试):
sudo apt-get update
apt-get install git
git clone https://github.com/cloudwu/skynet.git
apt-get install libreadline-dev autoconf
cd skynet
make linux
mkdir myServer
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
开启服务器监听
创建一个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);
}
}
}