如何在 Unity 中使用 SocketIOClient?

Posted

技术标签:

【中文标题】如何在 Unity 中使用 SocketIOClient?【英文标题】:How to use SocketIOClient in Unity? 【发布时间】:2015-02-12 09:25:31 【问题描述】:

我想将 json 数据从统一客户端发送到 asp.net 服务器。我已经在我的手机(android)上构建了应用程序,因此我需要 android 平台上支持的 websocket。我不知道 socketIO .Net 服务器将使用什么,但它可能使用 SignalR。我可以统一使用'SocketIO'吗?那么,你们能检查一下我的代码吗?

using UnityEngine;
using System.Collections;
using SocketIOClient;


public class NewBehaviourScript : MonoBehaviour 

// Use this for initialization
void Start () 



// Update is called once per frame
void Update () 
    string socketUrl = "http://127.0.0.1:3000";
    Debug.Log("socket url: " + socketUrl);

            //Client client = new Client (socketUrl);
            //client.Send ("hello world!");

    Client client = new Client(socketUrl);

    client.Opened += SocketOpened;
    //client.Message += SocketMessage;
    //client.SocketConnectionClosed += SocketConnectionClosed;
    //client.Error +=SocketError;
    //string message = "Unity : message";
    string message = "Unity - message";
    client.Send(message);
    client.Connect();   
    

private void SocketOpened(object sender, MessageEventArgs e) 
    //invoke when socket opened
    Debug.Log ("Hello");


/////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// /////////////

我决定使用 Websocket-Sharp 解决问题。我也用 asp.net 服务器测试过发送 json 数据。它运作良好。 下面是我的代码。

using UnityEngine;
using System.Collections;
using WebSocketSharp;
using System.IO;

public class socket : MonoBehaviour 


// Use this for initialization
void Start () 
    //Debug.Log ("start");
    test ();
    //Debug.Log ("end");


// Update is called once per frame
void Update () 



private void test()

    // Create empty JSONOBJECT
    JSONObject j = new JSONObject (JSONObject.Type.OBJECT);
    // Add Field (ref. protocol.docx)
    j.AddField ("cType", "auto");
    j.AddField ("indexOrder", "1");
    j.AddField ("oderCount", "1");
    j.AddField ("arSpeed", "1000");
    j.AddField ("mSpeed", "1000 ");
    j.AddField ("arM1", "180");
    j.AddField ("arM2", "180");
    j.AddField ("arM3", "180");
    j.AddField ("arM4", "180");
    j.AddField ("arM5", "180");
    j.AddField ("arM6", "180");
    j.AddField ("emer", "0");
    j.AddField ("direcM1", "0");
    j.AddField ("speedM1", "0");
    j.AddField ("direcM2", "0");
    j.AddField ("speedM2", "0");
    //j.AddField ("rollDirecM1", "0");
    //j.AddField ("rollSpeedM1", "0");
    //j.AddField ("rollDirecM2", "0");
    //j.AddField ("rollSpeedM2", "0");

    string encodedString = j.Print ();
    Debug.Log (encodedString);

    WebSocket ws = new WebSocket("ws://192.172.0.1:3000");
    ws.OnMessage += (sender, e) =>
        Debug.Log("Laputa says: " + e.Data);
    ws.Connect();
    ws.Send (encodedString);
    //ws.Send("Unity!!");


【问题讨论】:

您使用哪个版本的 Unity? Unity Pro 还是免费的? @BarışÇırıka 我正在使用 Unity Pro 版本。我认为 Unity 支持 websocket 库,但是当我“使用”时我找不到任何相关的 Websocket。所以我正在努力使用'websocket-sharp',但它没有足够的样本......我对服务器或客户端并不是很专业。你有什么想法吗? 你可以使用this 【参考方案1】:

我对 Unity 中的套接字了解不多,我只是想自己弄清楚。但是,您确定要在 Update() 函数中创建您的客户端吗?在我看来,Unity 会尝试在每一帧中创建一个全新的客户端。我想这可能是许多不同问题的原因。

可能 SocketIOClient 代码失败而 WebSocket 代码工作的原因是因为您从 Start() 函数而不是 Update() 函数调用了 WebSocket 代码。

【讨论】:

【参考方案2】:

我不确定你是否可以将 signalR 与 SocketIOClient 一起使用。

我同意哈里森的观点。您应该将套接字创建放在start() 函数中,并使用update() 来处理套接字事件。

【讨论】:

以上是关于如何在 Unity 中使用 SocketIOClient?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Unity 中使用 git/版本控制 [重复]

如何在 Unity 中使用 Gradle

如何使用新的输入系统在 Unity 中查找鼠标位置

如何在 Unity 中使用 SocketIOClient?

如何在 Unity 3D 中使用 goto 属性?

如何在 Unity 中使用 System.Speech?