2017-01-06 8 views
0

Я собираюсь реализовать клиент сокета для единства3D на C#, который подключается к signalr. Вот мой код:Реализовать соединение сокета для unique3d и signalr

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, которая обрабатывает signalr, правильно работает на основе браузеров. Я собираюсь реализовать свой собственный клиент для единства, но он не работает ..

я теперь, что я должен послать GET запрос что-то вроде этого:

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

Тогда я должен получить ConnectionID и ConnectionToken от ответа из выше запроса и отправьте сообщение 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, который помещается в моем собственном сервере? следует ли использовать сокеты или есть способ, как длительный опрос?

+0

Я полагаю, вы не используете реализации API-интерфейса клиента SignalR, потому что его не поддерживает Unity3d? Или я ошибаюсь? Если да, проверили ли вы https://github.com/jenyayel/SignalR.Client.20 –

+0

Да, потому что framework3. NET Framework 2.0, я видел этот проект, но я хочу написать свою собственную библиотеку, которая делает несколько простых задач (это статично)! –

+0

ах, так что теперь у вас есть хорошая эталонная реализация :) SignalR не является тривиальным, его использование websockets в качестве основного транспорта и возврат к другим вещам (например, длинный опрос и скрытые кадры), если ws не используется –

ответ

1

SignalR 2.x основан на HTTP. Из вашего кода трудно сказать, какой порт вы использовали, но проблема может заключаться в том, что вы не используете порт 80. Затем вы пытаетесь использовать перенос webSocket, но для этого вам нужно действительно использовать клиент webSocket (если вы не хотите также реализовать протокол webSocket, который не является тривиальным). Если вы действительно хотите написать клиент SignalR вот мои указатели:

  • Here является описание протокола SignalR я написал некоторое время назад
  • SignalR является открытым исходным кодом, и вы можете получить некоторые идеи из кода : https://github.com/Signalr/SignalR
  • самый простой, но полный клиент, который поддерживает только протокол WebSockets это https://github.com/aspnet/SignalR-Client-Cpp
  • Поскольку SignalR 2.x является HTTP на основе вы хотите использовать HttpClient/WebClient и не Sockets
+0

Если я использую HTTP из единства3D, это просто, очень просто. но как реализовать методы OnMessage или OnClose? Как я могу обрабатывать обратные вызовы отправленных сервером данных? и, к сожалению, ваша первая ссылка: я не могу ее открыть –

+0

Не знаете, почему вы не можете открыть ссылку - «работает на моей машине». Попробуйте скопировать его здесь: https: //blog.3d-logic.com/2015/03/29/signalr-on-the-wire-an-formal-description-of-the-signalr-protocol/ OnMessage - результат данных приема транспорта, поэтому он находится поверх HTTP. OnClose является результатом остановки клиента или клиента, который получает ошибку и не может повторно подключиться. Сам клиент SignalR C# построен поверх клиента HTTP и клиента WebSocket для транспорта webSocket - проверьте код, чтобы получить эту идею. – Pawel

+0

Вы имеете в виду, я должен позвонить OnMessage на моем клиенте, проверив тело ответа? поэтому, если да, как часто я должен это делать, его просьбу, я могу сделать это без signalr, я хочу сделать это без какого-либо запроса, пожалуйста, сообщите мне с некоторым кодом, также я читаю вашу ссылку, кстати, что tid в post parameterr? это транспортный идентификатор? как это можно установить? –