[Servidor/client] para jogos de grande porte
3 participantes
Página 1 de 1
[Servidor/client] para jogos de grande porte
Boa noite! eu estou planejando meu jogo e não pude deixar de notar isso, que necessito criar um servidor (e cliente) para meu jogo, porem os tutoriais que ensinam a fazer isso são bem vagos e acabo perdido novamente no final... eu vi alguns que usam unet, photon, etc... mas os que mais me chamaram atenção foram os feitos em C# usando o visual studio. creio que é possivel fazer isso rodar dentro da propria unity, como mostrar lista de usuario e etc... (mesmo que não tenha visto isso em nenhum dos tutoriais assistidos por mim) mas sempre que vou fazer um teste dá um erro, mesmo eu revisando cada detalhe... gostaria da ajuda de alguem que intenda do assunto, se possivel, claro! quero fazer meu servidor, mesmo que isso demore...
agradeço desde já!
2 dos videos que vi:
https://www.youtube.com/watch?v=Wwkht6BbcYA
https://www.youtube.com/watch?v=FY1QLjj2nwY
"CREDITO" do script: https://github.com/AbleOpus/NetworkingSampl / https://www.youtube.com/watch?v=xgLRe7QV6QI
agradeço desde já!
2 dos videos que vi:
https://www.youtube.com/watch?v=Wwkht6BbcYA
https://www.youtube.com/watch?v=FY1QLjj2nwY
- Script que testei, mas deram muitos erros e fui alterando:
- Código:
#region SERVER
private static readonly Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private static readonly List<Socket> clientSockets = new List<Socket>();
private const int BUFFER_SIZE = 2048;
private const int PORT = 100;
private static readonly byte[] buffer = new byte[BUFFER_SIZE];
static void MainServer()
{
_tittle.text = "Server";
SetupServer();
CloseAllSockets();
}
private static void SetupServer()
{
Debug.Log("Setting up server...");
serverSocket.Bind(new IPEndPoint(IPAddress.Any, PORT));
serverSocket.Listen(0);
serverSocket.BeginAccept(AcceptCallback, null);
Debug.Log("Server setup complete");
}
/// <summary>
/// Close all connected client (we do not need to shutdown the server socket as its connections
/// are already closed with the clients).
/// </summary>
private static void CloseAllSockets()
{
foreach (Socket socket in clientSockets)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
serverSocket.Close();
}
private static void AcceptCallback(IAsyncResult AR)
{
Socket socket;
try
{
socket = serverSocket.EndAccept(AR);
}
catch (ObjectDisposedException) // I cannot seem to avoid this (on exit when properly closing sockets)
{
return;
}
clientSockets.Add(socket);
socket.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, socket);
Debug.Log("Client connected, waiting for request...");
serverSocket.BeginAccept(AcceptCallback, null);
}
private static void ReceiveCallback(IAsyncResult AR)
{
Socket current = (Socket)AR.AsyncState;
int received;
try
{
received = current.EndReceive(AR);
}
catch (SocketException)
{
Debug.Log("Client forcefully disconnected");
// Don't shutdown because the socket may be disposed and its disconnected anyway.
current.Close();
clientSockets.Remove(current);
return;
}
byte[] recBuf = new byte[received];
Array.Copy(buffer, recBuf, received);
string text = Encoding.ASCII.GetString(recBuf);
Debug.Log("Received Text: " + text);
if (text.ToLower() == "get time") // Client requested time
{
Debug.Log("Text is a get time request");
byte[] data = Encoding.ASCII.GetBytes(DateTime.Now.ToLongTimeString());
current.Send(data);
Debug.Log("Time sent to client");
}
else if (text.ToLower() == "exit") // Client wants to exit gracefully
{
// Always Shutdown before closing
current.Shutdown(SocketShutdown.Both);
current.Close();
clientSockets.Remove(current);
Debug.Log("Client disconnected");
return;
}
else
{
Debug.Log("Text is an invalid request");
byte[] data = Encoding.ASCII.GetBytes("Invalid request");
current.Send(data);
Debug.Log("Warning Sent");
}
current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);
}
#endregion
#region CLIENT
private static readonly Socket ClientSocket = new Socket
(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private const int cPORT = 100;
static void MainClient()
{
_tittle.text = "Client";
ConnectToServer();
RequestLoop();
//Exit();
}
private static void ConnectToServer()
{
int attempts = 0, tentativa = 0;
while (!ClientSocket.Connected)
{
Debug.Log("Tentando conectar");
try
{
attempts++;
Debug.Log("Connection attempt " + attempts);
// Change IPAddress.Loopback to a remote IP to connect to a remote host.
ClientSocket.Connect(IPAddress.Loopback, cPORT);
http://ClientSocket.Connect("127.0.0.1", cPORT);
}
catch (SocketException)
{
Debug.Log("ERRO");
}
if(tentativa++ >= 10)
{
_tittle.text = "ERRO AO CONECTAR AO SERVIDOR!"; return; }
}
Debug.Log("Connected");
}
private static void RequestLoop()
{
http://Debug.Log(@"<Type ""exit"" to properly disconnect client>");
SendRequest();
ReceiveResponse();
}
/// <summary>
/// Close socket and exit program.
/// </summary>
private static void Exit()
{
SendString("exit"); // Tell the server we are exiting
ClientSocket.Shutdown(SocketShutdown.Both);
ClientSocket.Close();
}
private static void SendRequest()
{
Debug.Log("Send a request: ");
string request = textImput.text;//Console.ReadLine();
SendString(request);
if (request.ToLower() == "exit")
{
Exit();
}
}
/// <summary>
/// Sends a string to the server with ASCII encoding.
/// </summary>
private static void SendString(string text)
{
byte[] buffer = Encoding.ASCII.GetBytes(text);
ClientSocket.Send(buffer, 0, buffer.Length, SocketFlags.None);
}
private static void ReceiveResponse()
{
var buffer = new byte[2048];
int received = ClientSocket.Receive(buffer, SocketFlags.None);
if (received == 0) return;
var data = new byte[received];
Array.Copy(buffer, data, received);
string text = Encoding.ASCII.GetString(data);
Debug.Log(text);
}
#endregion
"CREDITO" do script: https://github.com/AbleOpus/NetworkingSampl / https://www.youtube.com/watch?v=xgLRe7QV6QI
Re: [Servidor/client] para jogos de grande porte
Não sei como ajudar com o código. Mas acho que se você quiser tentar refazer o cliente servidor em C# pode optar por esses tutoriais:
Vgomes- Iniciante
- PONTOS : 1602
REPUTAÇÃO : 0
Respeito as regras :
Re: [Servidor/client] para jogos de grande porte
Eu gosto bastante do LiteNetLib
https://github.com/RevenantX/LiteNetLib
https://github.com/RevenantX/LiteNetLib
Weslley- Moderador
- PONTOS : 5727
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: [Servidor/client] para jogos de grande porte
Vgomes escreveu:Não sei como ajudar com o código. Mas acho que se você quiser tentar refazer o cliente servidor em C# pode optar por esses tutoriais:
eu vi esse video tambem (alias, uma sequencia) mas nunca da certo no final das contas
Weslley escreveu:Eu gosto bastante do LiteNetLib
https://github.com/RevenantX/LiteNetLib
opa, vou fazer o teste assim que der tempo e dar uma pesquisada pra ver como instala/usa, vlw!
Tópicos semelhantes
» [DUVIDA] Da para colocar anúncios em jogos para PC ?
» Servidor De Desenvolvimento De Jogos GGI DISCORD
» Como sincronizar objetos do client para o host
» Como Faço Para Meu Jogo Ir Para Area Jogos Do Forum?
» 210 Linhas de código para inimigo é muito grande?
» Servidor De Desenvolvimento De Jogos GGI DISCORD
» Como sincronizar objetos do client para o host
» Como Faço Para Meu Jogo Ir Para Area Jogos Do Forum?
» 210 Linhas de código para inimigo é muito grande?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos