【发布时间】: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