为 unity3d 和信号器实现套接字连接



我将通过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.

在服务器端,一切都是正确的,处理 Signalr 的 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 2.x 是基于 HTTP 的。从您的代码中很难判断您使用了哪个端口,但问题可能是您没有使用端口 80。然后你尝试使用 webSocket 传输,但要做到这一点,你需要真正使用 webSocket 客户端(除非你还想自己实现 webSocket 协议,这并非易事)。如果你真的想编写 SignalR 客户端,下面是我的指示:

  • 这是我前段时间写的 SignalR 协议的描述
  • SignalR 是开源的,你可以从代码中获得一些想法:https://github.com/Signalr/SignalR
  • 仅支持 webSockets 协议的最基本但最完整的客户端是此 https://github.com/aspnet/SignalR-Client-Cpp
  • 由于 SignalR 2.x 是基于 HTTP 的,因此您希望使用 HttpClient/WebClient 而不是套接字

最新更新