C # Tcp подключение к Unity Android Apk - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть программа подключения TCP. Есть стороны клиента и сервера. Клиентский файл работает над единством как скрипт. Серверный файл работает на основном ПК и как настольное приложение. Когда я открываю файлы сервера и клиента, они работают на компьютере. Если я также разделю эти файлы на разные компьютеры и они снова будут работать. До здесь нет никаких проблем. Однако, если я хочу создать этот файл сценария на стороне клиента (который находится на Unity) в качестве Android Apk и переместить его на мое мобильное устройство, файл на стороне клиента работает, но не подключается к серверу. На компьютерах ошибок нет, но в файле apk есть ошибка.

C # Код на стороне сервера -

public Form1()
    {
        InitializeComponent();
    }
    //public virtual System.Windows.Forms.AnchorStyles Anchor { get; set; }
    private void Form1_Load(object sender, EventArgs e)
    {
        Console.WriteLine(string.Format("Starting TCP and UDP servers on port {0}...", 27015));

        devices_battery_midlow_pic_1.Visible = false;
        devices_battery_low_pic_1.Visible = false;
        devices_battery_midhigh_pic_1.Visible = false;
        devices_battery_high_pic_1.Visible = false;

        play_button.Anchor = (AnchorStyles.Bottom);

        Console.WriteLine(DateTime.Now.ToString() + " Getting IP...");
        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPAddress ipAddress2 = ipHostInfo.AddressList[1];
        connection_id_label.Text = "This IP:\n" + ipAddress2.MapToIPv4().ToString();

        Console.WriteLine(DateTime.Now.ToString() + " Starting Connection Thread...");

        connectionThread = new Thread(new ThreadStart(StartServer));
        connectionThread.IsBackground = true;
        connectionThread.Start();


    }

    private void StartServer()
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        TcpListener listener = new TcpListener(IPAddress.Any, 27015);
        listener.Start();
        while (true)
        {
            using (TcpClient client = listener.AcceptTcpClient())
            {
                using (NetworkStream stream = client.GetStream())
                {
                    byte[] buffer = new byte[client.ReceiveBufferSize];
                    int bytesRead = stream.Read(buffer, 0, client.ReceiveBufferSize);
                    string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
                    Console.WriteLine($"Received: {dataReceived}");
                    //Thread staThread = new Thread(() => PasteText(dataReceived));
                    //staThread.SetApartmentState(ApartmentState.STA);
                    //staThread.Start();
                }
            }
        }
     }

Сценарий на стороне клиента C # -

void Start()
{

    Debug.Log(string.Format("Starting TCP and UDP clients on port {0}...", 116));
    //udpThread = new Thread(new ThreadStart(ClientThread));
    //udpThread.Start();

    ClientThread();
}

// Update is called once per frame
void Update()
{

}

void OnGUI()
{
    if (GUI.Button(new Rect(10, 10, 150, 100), debugString))
    {
        print("You clicked the button!");
    }
}

void ClientThread()
{
    using (TcpClient client = new TcpClient("10.10.10.73", 27015))
    {
        using (NetworkStream stream = client.GetStream())
        {
            byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes("asdasd");
            stream.Write(bytesToSend, 0, bytesToSend.Length);
        }
    }
 }

Это слишком важно для меня. Я жду вашей помощи.

1 Ответ

0 голосов
/ 22 ноября 2019

ниже - демонстрация подключения из других моих проектов. Работает на Android / iOS / Mac / PC без проблем и проверено. Я использовал Loom для легкой работы с потоками, вы можете взять его где-нибудь с github, может быть.

или, может быть, просто так, как вы вводите IP. Это должно быть что-то вроде этого.

string IP = "127.0.0.1";
client.BeginConnect(IPAddress.Parse(IP), ClientListenPort, ClientEndConnect, null);

Это мой рабочий слушатель сервера:

//create listener
        listener = new TcpListener(IPAddress.Any, ClientListenPort);
        listener.Start();
        listener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

Loom.RunAsync(() => {
                while (!stop)
                {
                    // Wait for client connection
                    clients.Add(listener.AcceptTcpClient());
                    clients[clients.Count - 1].NoDelay = true;
                    // We are connected
                    isConnected = true;

                    streams.Add(clients[clients.Count - 1].GetStream());
                    streams[streams.Count - 1].WriteTimeout = 500;

                    Loom.QueueOnMainThread(() => {
                        isConnected = true;
                    });
                    System.Threading.Thread.Sleep(1);
                }
            });

Это демонстрационное соединение моего рабочего клиента:

Loom.RunAsync(() => {
        // if using the IPAD
        //client.Connect(IPAddress.Parse(IP), ClientListenPort);
        client.BeginConnect(IPAddress.Parse(IP), ClientListenPort, ClientEndConnect, null);
        while (!client.Connected)
        {
            System.Threading.Thread.Sleep(1);
        }

        //do sth...
    });

void ClientEndConnect(IAsyncResult result)
{
    client.EndConnect(result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...