如何在C#中实现socketIO以与NodeJS一起使用?

时间:2017-02-05 15:20:42

标签: c# node.js socket.io

我一直在尝试在C#上实施 Emit 广播 On 方法。

我知道有一个名为SocketIO4DotNet的软件包,我不想使用它,因为它已被弃用。我宁愿明白该怎么做。

我曾尝试阅读该软件包的代码,但它过于依赖依赖性,而且无处可去。

目前我有以下代码:

public class SocketIO
    {
        protected string host;

        protected int port;

        TcpClient client;

        public SocketIO(string host, int port)
        {
            this.host = host;
            this.port = port;
        }

        public bool connect()
        {
            if (isConnected())
            {
                return false;
            }

            try
            {
                client = new TcpClient();
                client.Connect(host, port);
                return true;
            }
            catch (Exception ex)
            {
                client = null;
                return false;
            }
        }

        public bool close()
        {
            if (!isConnected())
            {
                return false;
            }

            try
            {
                client.Close();
            }
            catch (Exception ex)
            {

            }
            finally
            {
                client = null;

            }
            return true;
        }

        public void Emit(string message, string data)
        {
            if (!isConnected())
            {
                return;
            }

            NetworkStream nwStream = client.GetStream();

            byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(data);
            nwStream.Write(bytesToSend, 0, bytesToSend.Length);

            byte[] bytesToRead = new byte[client.ReceiveBufferSize];
            int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize);
            string received = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead);

        }

        protected bool isConnected()
        {
            if (client == null)
            {
                return false;
            }
            return true;
        }

我需要了解如何创建监听器(On方法)以及如何以与数据一起发送消息的方式使用Emit和Broadcast。

1 个答案:

答案 0 :(得分:1)

因为我是团结的但是我不想将SocketIO用作MonoBehaviour,所以我调整了Unity SocketIO程序包以便在没有Unity本身的情况下工作。

这就是我所做的:

首先我已经下载了包本身: https://www.assetstore.unity3d.com/en/#!/content/21721

然后我将 SocketIOComponent Awake方法更改为其构造函数,并将其签名更改为接受url(可以发送更多参数)

public SocketIOComponent(string url)

我接下来要做的是创建一个我称之为 SocketIOAdapter

的包装器

这是代码:

public class SocketIOAdapter {

    SocketIOComponent socketIO;
    protected Thread socketThread;
    public SocketIOAdapter(string url)
    {
        socketIO = new SocketIOComponent(url);
    }

    public void Connect()
    {
        socketIO.Connect();
        socketThread = new Thread(socketIO.Update);
        socketThread.Start();
    }

    public void Emit(string eventName, JSONObject json)
    {
        socketIO.Emit(eventName, json);
    }

    public void On(string eventName, System.Action<SocketIOEvent> callback)
    {
        socketIO.On(eventName, callback);
    }
}

最后我调整了 SocketIOComponent 的Update方法来休眠并继续而不是返回,如下所示:

if (ackList.Count == 0)
{
   Thread.Sleep(100);
   continue;
}
if (DateTime.Now.Subtract(ackList[0].time).TotalSeconds < ackExpirationTime)
{
    Thread.Sleep(100);
    continue;
}

最后我像这样使用它:

socketIO = new SocketIOAdapter(serviceManager.getConfig().get("servers.socket") as string);
socketIO.Connect();
socketIO.On("connect", this.OnConnect);

听完这样的话:

void OnConnect(SocketIOEvent e)
{
    socketIO.Emit("shoot", new JSONObject("{}"));
}

到目前为止一切顺利,它运作良好。 希望这可以帮助那些人。