#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. Проблема решена. Спасибо вам за ваш ответ!