Unity зависает при получении данных от клиента сокета Java - PullRequest
0 голосов
/ 13 января 2019

Недавно я опубликовал вопрос о сокетах между C # и Java, а именно: между Unity и Android. Идея состоит в том, чтобы связать Unity с обычным мобильным приложением, чтобы иметь возможность взаимодействовать с устройствами, установленными в моделируемой среде в Unity (свет, двери и т. Д.), Мне удалось создать соединение, и я могу включать и выключать свет и При взаимодействии с устройствами проблема заключается в том, что каждый раз, когда я отправляю команды с мобильного телефона Unity, который он зависает, единственный способ следить за ходом его выполнения - закрывать приложение, закрывая соединение с сокетом, однако, как только я закрываю приложение, Unity читает полученную строку, затем обрабатывает эту строку и правильно управляет компонентами. Что я должен сделать, чтобы решить эту проблему? Я не очень разбираюсь в C #, и я искал информацию около четырех дней, но я не нашел много, поток останавливается на line 67: data = stremaReader.ReadLine ();

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

Соединение установлено между Unity и Android: [1] https://imgur.com/a/fyOhQy4

Записанные данные из Android-клиента: [2] https://imgur.com/a/Hnp0F1e

Данные, полученные и обработанные после закрытия заявки: [3] https://imgur.com/a/GgOrqpi

На этом этапе контрольная лампа может включаться и выключаться, но соединение должно быть разорвано.

Это мой класс сервера, написанный на Unity / C #

public class NetworkSocketManager : MonoBehaviour
{
private List<ServerClient> connectedClients;
private List<ServerClient> disconectedClients;
private TcpListener server;
private string data;
public GameObject ligth;
Thread readThread;
private string[] commands;
private NetworkStream stream;
private StreamReader stremaReader;
private bool serverStarted;
public int socketPort = 7691;

private void Start()
{
    connectedClients = new List<ServerClient>();
    disconectedClients = new List<ServerClient>();
    try
    {
        server = new TcpListener(IPAddress.Parse("192.168.1.64"),  socketPort);
        server.Start();

        serverListening();
        serverStarted = true;
        Debug.Log("Server started. Port: " + socketPort.ToString());

    }
    catch (Exception ex)
    {
        Debug.Log("Server socket error: " + ex);
    }
}

private void Update()
{
    if (!serverStarted)
        return;

    foreach (ServerClient client in connectedClients)
    {
        if (!IsConnected(client.tcp))
        {
            client.tcp.Close();
            disconectedClients.Add(client);
            continue;
        }
        else
        {
            stream = client.tcp.GetStream();
            Debug.Log("Open stream...");

            if (stream.DataAvailable)
            {
                Debug.Log("Received data...");

                this.stremaReader = new StreamReader(stream, false);
                data = stremaReader.ReadLine();

                if (data != null)
                    OnIcomingData(client, data);

            }
        }
    }
}

private void OnIcomingData(ServerClient client, string data)
{
    Debug.Log(client.clientName + " says: " + data);
    commands = data.Split(':');

    if (commands[0] == "1")
    {
        ligth.active = true;
    }
    else if (commands[0] == "0")
    {
        ligth.active = false;
    }

    Array.Clear(commands, 0, commands.Length);
    data = "";
}

private bool IsConnected(TcpClient tcp)
{
    try
    {

        if (tcp != null && tcp.Client != null && tcp.Client.Connected)
        {
            if (tcp.Client.Poll(0, SelectMode.SelectRead))
            {
                return !(tcp.Client.Receive(new byte[1], SocketFlags.Peek) == 0);
            }

            return true;

        }
        else
        {
            return false;
        }

    }
    catch
    {
        return false;
    }
}

private void serverListening()
{
    server.BeginAcceptTcpClient(AcceptTcpClient, server);
}
private void AcceptTcpClient(IAsyncResult asyncResult)
{
    TcpListener tcplistener = (TcpListener)asyncResult.AsyncState;
    connectedClients.Add(new  ServerClient(tcplistener.EndAcceptTcpClient(asyncResult)));
    serverListening();
}

}

public class ServerClient
{

public TcpClient tcp;
public string clientName;

public ServerClient(TcpClient tcp)
{
    this.tcp = tcp;
    this.clientName = "Android";
 }
}

Это мой клиентский класс Android:

public class SocketThread extends Thread {

private Socket adviser;
private DataOutputStream dataOut;

@Override
public void run() {
super.run();
Log.e("Status:", "Thread started");
try {
    adviser = new Socket("192.168.1.64", 7691);
    dataOut = new DataOutputStream(adviser.getOutputStream());
} catch (IOException ex) {
    Logger.getLogger(SocketThread.class.getName()).log(Level.SEVERE, null, ex);
 }
}

public void sendCommand(String text) {
try {
    dataOut.writeUTF(text);
    Log.e("Sended Text: ", text);
} catch (IOException ex) {
    Logger.getLogger(SocketThread.class.getName()).log(Level.SEVERE, null, ex);
 }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...