Проблема с подключением TCP IP с Unity с телефона Android на ПК (РЕШЕНА)

#android #unity3d #tcp #connection #ip

Вопрос:

ПРОБЛЕМА РЕШЕНА. -Мне просто нужно было изменить настройки IP-адреса телефона. После этого Это сработало!-

Я создал простое приложение с Unity, которое содержит кнопку и поле ввода, это приложение использует TCP-соединение, отправляет строку, записанную в поле ввода, в консольное приложение C#, которое работает как сервер.

Все отлично работает, когда я использую оба приложения на одном компьютере, но когда я устанавливаю файл apk на свой телефон, он не работает. И компьютер, и телефон подключены к одному и тому же маршрутизатору, и я также выключил брандмауэр. Это не первый раз, когда я использую Unity или tcp-соединение в приложении C#, но я впервые использую их вместе. У кого-нибудь была такая же проблема? И как вы ее решили? Я ценю любую помощь. Спасибо всем с этого момента!

приложение выглядит так, как это изображение приложения

Клиентский скрипт на Unity

             
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System.Text;
using System.Threading.Tasks; 
using System.IO;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System;
public class Client : MonoBehaviour
{
    private TcpClient tcpClient;

    public async Task Initialize(string ip, int port)
    {
        try
        {
            tcpClient = new TcpClient();
            await tcpClient.ConnectAsync(ip, port);
        }
        catch { }
    }

    public void Disconnect()
    {
        if (tcpClient.Connected)
            tcpClient.Close();
    }

    public bool Connected()
    {
        if (tcpClient != null)
            if (tcpClient.Connected)
                return true;

        return false;
    }

    public async Task Read()
    {
        var buffer = new byte[4096];
        var ns = tcpClient.GetStream();
        MemoryStream ms = new MemoryStream();
        while (true)
        {
            var bytesRead = await ns.ReadAsync(buffer, 0, buffer.Length);
            if (bytesRead <= 0) break; // Stream was closed
            ms.Write(buffer, 0, bytesRead);
            ms.Seek(0, SeekOrigin.Begin);
        }
        Debug.Log("connection closed");
    }


    public void BeginSend(string msg)
    {
        try
        {
            var bytes = Encoding.ASCII.GetBytes(msg   "n");
            var ns = tcpClient.GetStream();
            ns.BeginWrite(bytes, 0, bytes.Length, EndSend, bytes);
        }
        catch { }
    }

    public void EndSend(IAsyncResult result)
    {
        var bytes = (byte[])result.AsyncState;
    }
}
 

Консольное приложение TCP-сервера C# —

 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System.Text;
using System.Threading.Tasks; 
using System.IO;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System;


public class Client : MonoBehaviour
{
    private TcpClient tcpClient;

    public async Task Initialize(string ip, int port)
    {
        try
        {
            tcpClient = new TcpClient();
            await tcpClient.ConnectAsync(ip, port);
        }
        catch { }
    }

    public void Disconnect()
    {
        if (tcpClient.Connected)
            tcpClient.Close();
    }

    public bool Connected()
    {
        if (tcpClient != null)
            if (tcpClient.Connected)
                return true;

        return false;
    }

    public async Task Read()
    {
        var buffer = new byte[4096];
        var ns = tcpClient.GetStream();
        MemoryStream ms = new MemoryStream();
        while (true)
        {
            var bytesRead = await ns.ReadAsync(buffer, 0, buffer.Length);
            if (bytesRead <= 0) break; // Stream was closed
            ms.Write(buffer, 0, bytesRead);
            ms.Seek(0, SeekOrigin.Begin);
        }
        Debug.Log("connection closed");
    }


    public void BeginSend(string msg)
    {
        try
        {
            var bytes = Encoding.ASCII.GetBytes(msg   "n");
            var ns = tcpClient.GetStream();
            ns.BeginWrite(bytes, 0, bytes.Length, EndSend, bytes);
        }
        catch { }
    }

    public void EndSend(IAsyncResult result)
    {
        var bytes = (byte[])result.AsyncState;
    }
}
 

И сценарий UIController, который управляет пользовательским интерфейсом и TCP — соединением

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;
using System.IO;
using System.Net.Sockets;
using System.Text;




public class UIControl : MonoBehaviour
{
    //objects
    public Text textDeneme;

    private static byte[] MessageToByteArray(string message, Encoding encoding)
    {
        var byteCount = encoding.GetByteCount(message);
        if (byteCount > byte.MaxValue)
            throw new ArgumentException("Message size is greater than 255 bytes in the provided encoding");
        var byteArray = new byte[byteCount   1];
        byteArray[0] = (byte)byteCount;
        encoding.GetBytes(message, 0, message.Length, byteArray, 1);
        return byteArray;
    }

    
    public void connectBtn()
    {

        string message = textDeneme.text;
        var byteArray = MessageToByteArray(message, Encoding.ASCII);
        using (var tcpClient = new TcpClient())
        {
            tcpClient.Connect("192.168.1.133", 5000);
            using (var networkStream = tcpClient.GetStream())
            using (var bufferedStream = new BufferedStream(networkStream))
            {
                bufferedStream.Write(byteArray, 0, byteArray.Length);
            }
        }
    } 
}

 

Комментарии:

1. У меня были проблемы с текстовым редактором. Теперь упорядочены и добавлены коды.

2. Initialize(string ip, int port) Мы не можем видеть, какой ip вы использовали, и вы не сказали. И где вызывается эта функция?

3. он вызывает его из функции connectBtn ().

4. Инициализировать()? Не вижу этого. В любом случае у вас будет исключение NetworkOnMainThreadException. Взгляните на журналы.

5. Проблема решена. Спасибо вам за ваш ответ!