我一直在尝试在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。
答案 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("{}"));
}
到目前为止一切顺利,它运作良好。 希望这可以帮助那些人。