【问题标题】:Implement a socket connection for unity3d and signalr为 unity3d 和 signalr 实现套接字连接
【发布时间】:2017-01-07 02:51:44
【问题描述】:

我将通过连接到 signalr 的 C# 为 unity3D 实现一个套接字客户端。这是我的代码:

public void StartClient()
{

    try
    {
        IPHostEntry ipHostInfo = Dns.GetHostEntry("http://www.MYURL.com/signalr/hubs");
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);

        // Create a TCP/IP socket.
        Socket client = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);

        // Connect to the remote endpoint.
        client.BeginConnect(remoteEP,
            new AsyncCallback(ConnectCallback), client);

        client.Shutdown(SocketShutdown.Both);
        client.Close();
    }
    catch (Exception e)
    {
        print(e.ToString());
    }
}
private void ConnectCallback(IAsyncResult ar)
{
    try
    {
        // Retrieve the socket from the state object.
        Socket client = (Socket)ar.AsyncState;

        // Complete the connection.
        client.EndConnect(ar);

        print("Socket connected to "+client.RemoteEndPoint.ToString());

        // Signal that the connection has been made.
        //connectDone.Set();
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
}

但是当我调用 StartClient() 时,它会抛出这个:

System.Net.Sockets.SocketException: No such host is known.

在服务器端,一切都是正确的,处理信号器的 HTML 页面对于基于浏览器的客户端正常工作。我将实现我自己的统一客户端,但它不起作用..

我现在应该发送类似这样的 GET 请求:

GET /signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22chapter3hub%22%7D%5D&_=142051 HTTP/1.1

然后我应该从上述请求的响应中获取 ConnectionID 和 ConnectionToken ,并再次发送 Post Reqeust 以授权用户:

POST /signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=GaRyosG%2Fu1%2BU%2B9yusdn0lVb&connectionData=%5B%7B%22name%22%3A%22chapter3hub%22%7D%5D

但我不知道如何在我自己的服务器中的 unity3d 和 signalr 之间建立连接?我应该使用套接字还是长轮询之类的方法?

【问题讨论】:

  • 我猜你没有使用 SignalR 的客户端 API 实现,因为 Unity3d 不支持它?还是我错了?如果是这样,你检查过github.com/jenyayel/SignalR.Client.20
  • 是的,因为 unity3D .net 框架是 2.0,我看过这个项目,但我想编写自己的库来完成一些简单的任务(它有点静态)!
  • 啊,所以你现在有一个很好的参考实现 :) SignalR 不是微不足道的,它使用 websockets 作为 sa 主要传输,如果 ws 不是,它会退回到其他东西(如长轮询和隐藏帧)利用
  • 是的,我已经阅读了文档,在我的项目中,服务器和客户端都接受 websockets。你提到的实现很好,但我认为它非常复杂。我需要澄清统一和服务器之间的连接
  • 那么你也打算自己实现websockets吗?

标签: c# sockets unity3d signalr


【解决方案1】:

SignalR 2.x 基于 HTTP。从您的代码中很难判断您使用的是哪个端口,但问题可能是您没有使用端口 80。然后您尝试使用 webSocket 传输,但要做到这一点,您需要真正使用 webSocket 客户端(除非您还想实现您自己的 webSocket 协议,这不是微不足道的)。 如果你真的想写 SignalR 客户端,这里是我的指针:

【讨论】:

  • 如果我使用来自 unity3D 的 HTTP,它很简单,非常简单。但是如何实现 OnMessage 或 OnClose 方法呢?如何处理服务器发送数据的回调?不幸的是,您的第一个链接:我无法打开它
  • 不知道为什么你不能打开链接 - “在我的机器上工作”。尝试从这里复制它:blog.3d-logic.com/2015/03/29/… OnMessage 是传输接收数据的结果,因此它位于 HTTP 之上。 OnClose 是停止客户端或客户端出现错误并且无法重新连接的结果。 SignalR C# 客户端本身构建在 HTTP 客户端和 WebSocket 客户端之上,用于 webSocket 传输 - 检查代码以了解想法。
  • 你的意思是,我应该通过检查响应正文来调用我的客户端上的 OnMessage 吗?所以如果是的话,我应该多久做一次,这是一种请求,我可以在没有信号器的情况下完成,我想在没有任何请求的情况下这样做,请告诉我一些代码,我也在阅读你的链接,顺便说一下tid 在 post 参数中?是运输ID吗?怎么设置?
  • OnMessage 将根据传输方式被调用 - 对于 webSockets,它对应于 ReceiveAsync,对于 serverSentEvents,当接收到新的“数据”帧进行长轮询时,它与完成的轮询请求相关。我已经在回复中提供了两个参考实现(实际上是 3 个,因为 SignalR 存储库不仅包含 C#,还包含 javascript 客户端)。
  • 当我发送带有 connectionToken 和 data 的连接请求时,服务器响应是: ConnectionId 的格式不正确。 ,为什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 2017-04-09
相关资源
最近更新 更多