Я пытаюсь сделать приложение andorid, которое commuicates с моим сервером через Unity 5.4. Устройства должны быть в одной сети для этого.Возможно ли использование TcpClients в единстве3d для андроида?
Для этого я использую System.Net.Sockets и TcpClient для подключения к моему серверу. Все работает хорошо, когда я запускаю его из редактора или создаю его как автономный Windows. Связь между хостингом ПК и другим компьютером, работающим автономно, возможна и работает по назначению. Как только я построю его как .apk и установлю его на своем смартфоне, я получу SocketException. Также мой телефон застрял в загрузке в течение некоторого времени
Использует TcpClient, возможно ли это на Android с единством3d?
Исключение я получаю:
System.Net.Sockets.SocketException: Connection timed out
Я убедился, что оба устройства находятся в одной и той же сети, например, Ip для моего ПК, на котором размещен сервер, - 192.168.178.24, а ip для моего смартфона - 192.168.178.113.
Необходимые порты открыты, а межсетевой экран пропускает данные.
Я запущенный этот код в Unity:
private TcpClient client;
private StreamWriter writer;
void Start()
{
try
{
client = new TcpClient(AddressFamily.InterNetwork);
IPAddress ipAddress = IPAddress.Parse(PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey));
Debug.Log(ipAddress.ToString());
client.Connect(ipAddress, 11000);
writer = new StreamWriter(client.GetStream());
Debug.Log("connected");
}
catch (ArgumentNullException ane)
{
Debug.Log(string.Format("ArgumentNullException : {0}", ane.ToString()));
}
catch (SocketException se)
{
Debug.Log(string.Format("SocketException : {0}", se.ToString()));
}
catch (Exception e)
{
Debug.Log(string.Format("Unexpected exception : {0}", e.ToString()));
}
}
я проверил, если адрес Ip получил от игрока префов правильно, то есть.
Есть ли у кого-то идея, что заставляет его даже не устанавливать соединение? Я попробовал Wireshark на своем компьютере, он не показывал никаких входящих пакетов, поэтому я предполагаю, что ошибка иногда возникает при установлении соединения.
Вот изображение для моего выхода журнала из смартфона: LogCat Output
Edit: код сервера
public class ServiceListener
{
public TcpListener Listener;
public void StartListening()
{
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddress = Array.Find<IPAddress>(ipHostInfo.AddressList, ipMatch => ipMatch.AddressFamily == AddressFamily.InterNetwork);
Listener = new TcpListener(ipAddress, 11000);
Listener.Start();
}
public void StopListening()
{
Listener.Stop();
}
}
static void Main()
{
ServiceListener currentListener = new ServiceListener();
currentListener.StartListening();
TcpClient currentClient = currentListener.Listener.AcceptTcpClient();
StreamReader reader = new StreamReader(currentClient.GetStream());
Console.WriteLine("Connected");
while (true)
{
byte[] messageBytes = new byte[1024];
if (!reader.EndOfStream)
{
string message = reader.ReadLine();
string[] messageParts = message.Split('|');
int xOffset = int.Parse(messageParts[0]);
int yOffset = int.Parse(messageParts[1]);
bool leftClick = bool.Parse(messageParts[2]);
bool rightClick = bool.Parse(messageParts[3]);
Console.WriteLine(string.Format("x:{0},y:{1},left:{2},right:{3}", xOffset, yOffset, leftClick, rightClick));
}
else
{
currentClient = currentListener.Listener.AcceptTcpClient();
reader = new StreamReader(currentClient.GetStream());
}
}
}
Я только что вспомнил об этом. Разве это еще не решено? – Programmer
Теперь это wokring, но я точно не знаю почему. И я хочу предоставить решение для людей, имеющих ту же проблему. У меня было свободное время, когда я был в дороге, поэтому я попробовал это с моим ноутбуком, копировал и вставлял код сервера в новый проект, и он работал. как-то мой сервер просто не принимал андроид, но с использованием 100% того же кода он работал после копирования и вставки его в новый проект. – Kusakari13
Я попробовал, и это сработало из коробки. Вероятно, это проблема межсетевого экрана. Вы можете реализовать его с помощью другого потока или использовать асинхронный метод. Счастливое кодирование! – Programmer