我如何在C#中实现socketIO与NodeJS一起工作?
我一直在尝试在C#上实现Emit Broadcast和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; }
我需要了解如何创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("{}")); }
到目前为止,这很好,它运作良好。 希望这可以帮助那里的人。