2017-01-11 6 views
0

Я написал код для передачи данных с внешнего сервера в Hololens. Я могу подключить Hololens к серверу. Но я столкнулся с проблемой отправки данных с сервера на Hololens. Всякий раз, когда я вызываю функцию ReadData, она даже не подключена (она печатает не подключена).

Я совершенно новичок в c# и единстве и пока не могу разобраться в этом вопросе. Я использую классы StreamSocket и DataReader для подключения и чтения данных соответственно. Функция Connect() соединяется с сервером в методе start(), а затем вызываю функцию ReadData в методе update() для получения данных с сервера в каждом кадре. Я прикрепляю свой файл кода. Можете ли вы помочь мне в решении моей проблемы. Спасибо заранее.Не удается прочитать данные с внешнего сервера в Hololens

using System.Collections; 
using System.Collections.Generic; 
using System.Net.Sockets; 
using System.Threading; 
using System.Text; 
using System.Net; 
using System; 
using UnityEngine; 
#if !UNITY_EDITOR && UNITY_METRO 
using Windows.Networking.Sockets; 
using Windows.Storage.Streams; 
using Windows.Networking; 
using Windows.Foundation; 
#endif 
public class TCPclientRead : MonoBehaviour 
{ 
    public string ServerIP = "10.1.2.35"; 


    [Tooltip("The connection port on the machine to use.")] 
    public int ConnectionPort = 11000; 

    private string data = "connected" ; 

    public TextMesh mesh; 
    private bool connected = false; 

#if !UNITY_EDITOR && UNITY_METRO 

    private StreamSocket networkConnection; 

     /// <summary> 
     /// Temporary buffer for the data we are recieving. 
     /// </summary> 
    //private byte[] dataBuffer; 


    public void Connect() 
    { 
      // Setup a connection to the server. 
       HostName networkHost = new HostName(ServerIP.Trim()); 

       //HostName networkHost = new HostName(IPAddress.Any.ToString());  
       networkConnection = new StreamSocket(); 

      // Connections are asynchronous. 
      // !!! NOTE These do not arrive on the main Unity Thread. Most Unity operations will throw in the callback !!! 
      IAsyncAction outstandingAction = networkConnection.ConnectAsync(networkHost, ConnectionPort.ToString()); 
      AsyncActionCompletedHandler aach = new AsyncActionCompletedHandler(NetworkConnectedHandler); 
      outstandingAction.Completed = aach;  
    } 

    public void NetworkConnectedHandler(IAsyncAction asyncInfo, AsyncStatus status) 
    { 
      if (status == AsyncStatus.Completed) 
      { 
       connected = true; 
       // Here Just display connected 

      } 
      else 
      { 
       connected = false;  
       Debug.Log("Failed to establish connection. Error Code: " + asyncInfo.ErrorCode); 
       // In the failure case we'll requeue the data and wait before trying again. 
       networkConnection.Dispose(); 

      }  

    } 


    public void ReadData() 
    { 
     if(connected) 
     { 
      DataReader reader = new DataReader(networkConnection.InputStream); 
      reader.InputStreamOptions = InputStreamOptions.Partial; 
      reader.LoadAsync(512); 
      data = reader.ReadString(512); 

     } 

    } 


    private void Start() 
    { 
     mesh = gameObject.GetComponent<TextMesh>(); 
     Connect(); 
    } 


    private void Update() 
    { 

     if (connected) 
     {  
      mesh.text = data; 


     } 
     else 
      mesh.text = "Not Connected"; 
     ReadData(); 
    } 

#endif 

} 

Edit: 1. Я сомневаюсь, что ReadData() потребности называться асинхронно Поэтому я обновил код, но он не работает и сейчас. 2. Я использую Unity Editor, и я включил необходимые настройки, и я могу подключиться к серверу. Просто я не могу передать данные. 3. Я использую netcat для создания сервера.

Мой обновленный код

delegate void DelegateMethod(); 

    public async void ReadData() 
    { 
     if(connected) 
     { 
      DataReader reader = new DataReader(networkConnection.InputStream); 
      reader.InputStreamOptions = InputStreamOptions.Partial; 
      await reader.LoadAsync(512); 
      data = reader.ReadString(512); 

     } 

    } 

    public void AsynCall() 
    { 
     DelegateMethod dlgt = new DelegateMethod(this.ReadData); 
     IAsyncResult ar = dlgt.BeginInvoke(null, null); 
     dlgt.EndInvoke(ar); 
    } 

    private void Start() 
    { 
     mesh = gameObject.GetComponent<TextMesh>(); 
     Connect(); 
    } 


    private void Update() 
    { 

     if (connected) 
     { 

      if(String.IsNullOrEmpty(data)) 
       data = "Improper";  

      AsynCall(); 
      mesh.text = data;    
     } 
     else 
      mesh.text = "Not Connected"; 

    } 
+0

Вопросы, требующие помощи по отладке («** почему этот код не работает? **») должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для его воспроизведения ** в самом вопросе ** , Вопросы без ** ясной постановки проблемы ** не полезны другим читателям. См. [Как создать минимальный, завершенный и проверяемый пример] (http://stackoverflow.com/help/mcve). –

+0

Я думаю, вы не прочитали полную запись, о которой я упомянул о желаемом поведении (для передачи данных), моей проблеме и соответствующем коде. Я буду приветствовать любое другое предложение по улучшению этой должности. –

+0

Выполняется ли вызов 'Connect' complete/- обратный вызов? Документы (https://msdn.microsoft.com/en-us/library/windows/apps/hh701509) предполагают, что 'ConnectAsync' должен использовать имя службы для второго параметра, а не для порта. –

ответ

1

Мои подозрения в том, что вы не включили UWP Capability «InternetClient», который не допускал бы его от фактического подключения к удаленному серверу. Вы не указываете, какую цепочку инструментов используете, но если вы находитесь в режиме проверки Unity в разделе «Настройки сборки» -> «Настройки публикации» -> «Магазин Windows» -> «Параметры публикации» -> «Возможности». Если вы работаете в Visual Studio, вы можете настроить его в свойствах проекта.

+0

Я включил эти свойства, и именно поэтому я могу подключиться к Hololens. Моя проблема - всякий раз, когда я вызываю функцию ReadData, она говорит, что не подключена, иначе она говорит о подключении. –