Невозможно подключить Unity TCP с использованием фиксированного IP-адреса из GCP (Google Cloud Platform)C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно подключить Unity TCP с использованием фиксированного IP-адреса из GCP (Google Cloud Platform)

Сообщение Anonymous »

Я плохо владею английским, поэтому пользуюсь переводчиком. Пожалуйста, будьте терпеливы, если некоторые из предполагаемых значений не понятны.
В настоящее время я работаю над подключением клиента и сервера Unity TCP с использованием внешнего IP-адреса, полученного из Google Cloud. Платформа (GCP). Однако, несмотря на многочисленные попытки, мне не удалось установить успешное соединение с фиксированным IP-адресом от GCP. Ниже я перечисляю то, что я уже проверил, и проблемы, которые сохраняются. Если бы кто-нибудь мог указать на какие-либо упущенные из виду аспекты или потенциальные решения, я был бы очень признателен.

У меня возникли проблемы с TCP-соединением в Unity с использованием статического соединения. IP создан на Google Cloud Platform (GCP). Я попытался установить соединение сервер-клиент с использованием TCP с внешним IP-адресом, назначенным GCP, но после нескольких попыток мне все еще не удалось устранить ошибку, описанную ниже, и, следовательно, не удалось использовать внешний IP-адрес. Если у кого-то есть предложения по поводу того, что я мог упустить из виду, или если у вас есть потенциальные решения или понимание причины, я был бы очень признателен за вашу помощь.
Подтвержденные функциональные компоненты
Переадресация портов внутреннего IP-адреса: проверьте настройки NAT, войдя в маршрутизатор. Пинг-тест: подтверждено активное сетевое соединение путем проверки связи с IP-адресом сервера GCP от клиента.
Правила брандмауэра GCP: Диапазон исходных IP-адресов: 0.0.0.0/0 Протокол TCP: Разрешено Направление: входящий порт и Статический IP-адрес: проблем не выявлено.
Настройки экземпляра виртуальной машины: Брандмауэр: трафик HTTP и HTTPS разрешен.
Удаленный доступ к серверу GCP SSH: вход выполнен успешно. сервер со статическим IP-адресом, созданным GCP.
Локальное тестирование с 127.0.0.1: локальное тестирование прошло успешно.
Проблемы: Ошибка Unity: Результат: невозможно подключиться, поскольку целевой компьютер активно отказывается от соединения.
Попытки отключить брандмауэр Windows: попробовал отключить брандмауэр Windows, но столкнулся с той же неудачей. Задержка выполнения клиентского кода: выполнение клиентского кода задерживается на 5 секунд, чтобы гарантировать, что сервер запускается первым, но без изменений в результате.
Настройка исходного кода Unity: серверный и клиентский коды были назначены для отдельных компоненты на пустых игровых объектах в Unity.
Server.cs
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using UnityEngine;
using System;
using System.IO;

public class Server : MonoBehaviour
{
List clients;
List disconnectList;
TcpListener server;
bool serverStarted;
private const int PORT = 8000; // Set port number
private const string IP_ADDRESS = "0.0.0.0"; // Allow connections from all IPs

public void ServerCreate()
{
clients = new List();
disconnectList = new List();

try
{
server = new TcpListener(IPAddress.Parse(IP_ADDRESS), PORT);
server.Start();
Debug.Log($"Server started on port {PORT}.");
StartListening();
serverStarted = true;
}
catch (Exception e)
{
Debug.LogException(e);
}
}

void Start()
{
ServerCreate();
}

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

foreach (ServerClient c in clients)
{
if (!IsConnected(c.tcp))
{
c.tcp.Close();
disconnectList.Add(c);
continue;
}
else
{
NetworkStream s = c.tcp.GetStream();
if (s.DataAvailable)
{
string data = new StreamReader(s, true).ReadLine();
if (data != null)
OnIncomingData(c, data);
}
}
}

for (int i = 0; i < disconnectList.Count; i++)
{
Debug.Log($"{disconnectList.clientName} disconnected.");
clients.Remove(disconnectList);
disconnectList.RemoveAt(i);
}
}

bool IsConnected(TcpClient c)
{
try
{
if (c != null && c.Client != null && c.Client.Connected)
{
if (c.Client.Poll(0, SelectMode.SelectRead))
return !(c.Client.Receive(new byte[1], SocketFlags.Peek) == 0);
return true;
}
else
return false;
}
catch
{
return false;
}
}

void StartListening()
{
server.BeginAcceptTcpClient(AcceptTcpClient, server);
}

void AcceptTcpClient(IAsyncResult ar)
{
TcpListener listener = (TcpListener)ar.AsyncState;
ServerClient newClient = new ServerClient(listener.EndAcceptTcpClient(ar));
clients.Add(newClient);
Debug.Log($"Client connected: {newClient.clientName}");
StartListening();
}

void OnIncomingData(ServerClient c, string data)
{
if (data.Contains("&NAME"))
{
c.clientName = data.Split('|')[1];
Debug.Log($"{c.clientName} connected.");
return;
}
}

public void Broadcast(string data, List cl)
{
foreach (var c in cl)
{
try
{
StreamWriter writer = new StreamWriter(c.tcp.GetStream());
writer.WriteLine(data);
writer.Flush();
}
catch (Exception e)
{
Debug.LogException(e);
}
}
}
}

public class ServerClient
{
public TcpClient tcp;
public string clientName;

public ServerClient(TcpClient clientSocket)
{
clientName = "Guest";
tcp = clientSocket;
}
}

Client.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using System.IO;
using System;

public class Client : MonoBehaviour
{
bool socketReady;
TcpClient socket;
NetworkStream stream;
StreamWriter writer;
StreamReader reader;
private const string SERVER_IP = " "; // GCP Static IP
private const int SERVER_PORT = 8000; // Client port number

public void ConnectToServer()
{
if (socketReady) return;

try
{
socket = new TcpClient(SERVER_IP, SERVER_PORT);
stream = socket.GetStream();
writer = new StreamWriter(stream);
reader = new StreamReader(stream);
socketReady = true;
Debug.Log("Connected to server.");
SendClientName("Guest" + UnityEngine.Random.Range(1000, 10000)); // Random client name
}
catch (Exception e)
{
Debug.Log($"Socket error: {e.Message}");
}
}

void Start()
{
StartCoroutine(ConnectAfterDelay());
}

private IEnumerator ConnectAfterDelay()
{
yield return new WaitForSeconds(5); // Delay to allow server startup
ConnectToServer();
}

void Update()
{
if (socketReady && stream.DataAvailable)
{
string data = reader.ReadLine();
if (data != null)
Debug.Log(data); // Display received data
}
}

void SendClientName(string clientName)
{
Send($"&NAME|{clientName}");
}

void Send(string data)
{
if (!socketReady) return;

writer.WriteLine(data);
writer.Flush();
}

void OnApplicationQuit()
{
CloseSocket();
}

void CloseSocket()
{
if (!socketReady) return;

writer.Close();
reader.Close();
socket.Close();
socketReady = false;
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... d-platform
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Невозможно подключить Unity TCP с использованием фиксированного IP-адреса из GCP (Google Cloud Platform)
    Anonymous » » в форуме C#
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Нужна помощь в объемных журналах загрузки с Google Cloud Platform - Cloud Logging
    Anonymous » » в форуме JAVA
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Нужна помощь в объемных журналах загрузки с Google Cloud Platform - Cloud Logging
    Anonymous » » в форуме JAVA
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Соединение Docker Cloud Cloud Cloud Cloud
    Anonymous » » в форуме JAVA
    0 Ответы
    79 Просмотры
    Последнее сообщение Anonymous
  • Соединение Docker Cloud Cloud Cloud Cloud
    Anonymous » » в форуме JAVA
    0 Ответы
    64 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»