我将通过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 而不是套接字