我如何在C#中实现socketIO与NodeJS一起工作?

我一直在尝试在C#上实现Emit BroadcastOn方法。

我知道有一个名为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; } 

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

所以,因为我是统一的,但是我不想使用SocketIO作为MonoBehaviour,所以我调整了Unity SocketIO包,以便在没有Unity本身的情况下工作。

这就是我所做的:

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

然后,我改变了SocketIOComponent的 Awake方法作为它的构造函数,并改变了它的签名来接受url(更多的参数可以被发送)

 public SocketIOComponent(string url) 

接下来我做的是创build一个叫做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方法来hibernate,继续而不是返回,如下所示:

 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("{}")); } 

到目前为止,这很好,它运作良好。 希望这可以帮助那里的人。