2017-01-11 6 views
0

J'ai écrit du code pour transférer des données du serveur externe à Hololens. Je suis capable de connecter Hololens au serveur. Mais je suis confronté à un problème en envoyant les données du serveur à Hololens. Chaque fois que j'appelle la fonction ReadData, il n'est même pas connecté (il imprime pas connecté).

Je suis tout à fait nouveau à c# et l'unité et n'est pas en mesure de résoudre ce problème pour le moment. J'utilise les classes StreamSocket et DataReader pour se connecter et lire les données respectivement. La fonction Connect() se connecte au serveur dans la méthode start() puis j'appelle la fonction ReadData dans la méthode update() pour obtenir les données du serveur à chaque trame. Je joins mon fichier de code. Pouvez-vous m'aider à résoudre mon problème Merci d'avance.Impossible de lire les données du serveur externe vers 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. Je doute que ReadData() doit être appelée de manière asynchrone donc je mis à jour le code mais il ne fonctionne pas, même maintenant. 2. J'utilise Unity Editor et j'ai activé les paramètres requis et je suis capable de me connecter au serveur. C'est juste que je ne suis pas capable de transférer les données. 3. J'utilise netcat pour créer un serveur.

Mon code mis à jour

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

Les questions nécessitant une aide au débogage ("** pourquoi ce code ne fonctionne pas? **") doivent inclure le comportement souhaité, un problème ou une erreur spécifique et le code le plus court nécessaire pour le reproduire ** dans la question même ** . Les questions sans ** énoncé de problème clair ** ne sont pas utiles aux autres lecteurs. Voir: [Comment créer un exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). –

+0

Je suppose que vous n'avez pas lu le message complet J'ai mentionné le comportement souhaité (pour transférer des données), mon problème et le code associé. Je me réjouis de toute autre suggestion pour améliorer le poste. –

+0

L'appel de 'Connect' est-il terminé/le rappel est-il déclenché? Les documents (https://msdn.microsoft.com/en-us/library/windows/apps/hh701509) suggèrent que 'ConnectAsync' doit prendre un nom de service pour le deuxième paramètre, pas le port. –

Répondre

1

Je soupçonne que vous n'avez pas activé la capacité UWP « InternetClient » qui l'empêcherait de se connecter réellement au serveur distant. Vous ne mentionnez pas la chaîne d'outils que vous utilisez, mais si vous êtes dans Unity, cochez Paramètres de construction -> Paramètres de publication -> Windows Store -> Paramètres de publication -> Capacités. Si vous travaillez dans Visual Studio, vous pouvez l'ajuster dans les propriétés du projet.

+0

J'ai activé ces propriétés et c'est pourquoi je suis capable de me connecter aux Hololens. Mon problème est chaque fois que j'appelle la fonction 'ReadData', elle dit non connectée sinon elle dit connectée. –