Я написал код для передачи данных с внешнего сервера в 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";
}
Вопросы, требующие помощи по отладке («** почему этот код не работает? **») должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для его воспроизведения ** в самом вопросе ** , Вопросы без ** ясной постановки проблемы ** не полезны другим читателям. См. [Как создать минимальный, завершенный и проверяемый пример] (http://stackoverflow.com/help/mcve). –
Я думаю, вы не прочитали полную запись, о которой я упомянул о желаемом поведении (для передачи данных), моей проблеме и соответствующем коде. Я буду приветствовать любое другое предложение по улучшению этой должности. –
Выполняется ли вызов 'Connect' complete/- обратный вызов? Документы (https://msdn.microsoft.com/en-us/library/windows/apps/hh701509) предполагают, что 'ConnectAsync' должен использовать имя службы для второго параметра, а не для порта. –