Test de communication de paquets entre un client et un serveur
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

Server.cs 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using UnityEngine;
  7. public class Server
  8. {
  9. public static int MaxPlayers { get; private set; }
  10. public static int Port { get; private set; }
  11. public static Dictionary<int, Client> clients = new Dictionary<int, Client>();
  12. public delegate void PacketHandler(int _fromClient, Packet _packet);
  13. public static Dictionary<int, PacketHandler> packetHandlers;
  14. public static TcpListener tcpListener;
  15. public static UdpClient udpListener;
  16. public static void Start(int _maxPlayers, int _port)
  17. {
  18. MaxPlayers = _maxPlayers;
  19. Port = _port;
  20. Debug.Log("Starting Server...");
  21. InitializeServerData();
  22. tcpListener = new TcpListener(IPAddress.Any, Port);
  23. tcpListener.Start();
  24. tcpListener.BeginAcceptTcpClient(TCPConnectCallback, null);
  25. udpListener = new UdpClient(Port);
  26. udpListener.BeginReceive(UDPReceiveCallback, null);
  27. Debug.Log($"Server started on port : {Port}.");
  28. }
  29. private static void TCPConnectCallback(IAsyncResult _result)
  30. {
  31. TcpClient _client = tcpListener.EndAcceptTcpClient(_result);
  32. tcpListener.BeginAcceptTcpClient(new AsyncCallback(TCPConnectCallback), null);
  33. Debug.Log($"Incoming connection from {_client.Client.RemoteEndPoint}...");
  34. for (int i = 1; i <= MaxPlayers; i++)
  35. {
  36. if (clients[i].tcp.socket == null)
  37. {
  38. clients[i].tcp.Connect(_client);
  39. return;
  40. }
  41. }
  42. Debug.Log($"{_client.Client.RemoteEndPoint} failed to connect. server full !");
  43. }
  44. private static void UDPReceiveCallback(IAsyncResult _result)
  45. {
  46. try
  47. {
  48. IPEndPoint _clientEndPoint = new IPEndPoint(IPAddress.Any, 0);
  49. byte[] _data = udpListener.EndReceive(_result, ref _clientEndPoint);
  50. udpListener.BeginReceive(UDPReceiveCallback, null);
  51. if (_data.Length < 4)
  52. {
  53. return;
  54. }
  55. using (Packet _packet = new Packet(_data))
  56. {
  57. int _clientId = _packet.ReadInt();
  58. if (_clientId == 0)
  59. {
  60. return;
  61. }
  62. if (clients[_clientId].udp.endPoint == null)
  63. {
  64. clients[_clientId].udp.Connect(_clientEndPoint);
  65. return;
  66. }
  67. if (clients[_clientId].udp.endPoint.ToString() == _clientEndPoint.ToString())
  68. {
  69. clients[_clientId].udp.HandleData(_packet);
  70. }
  71. }
  72. }
  73. catch (Exception _ex)
  74. {
  75. Debug.Log($"Error receiving UDP data: {_ex}");
  76. }
  77. }
  78. public static void SendUDPData(IPEndPoint _clientEndPoint, Packet _packet)
  79. {
  80. try
  81. {
  82. if (_clientEndPoint != null)
  83. {
  84. udpListener.BeginSend(_packet.ToArray(), _packet.Length(), _clientEndPoint, null, null);
  85. }
  86. }
  87. catch (Exception _ex)
  88. {
  89. Debug.Log($"Error sending data to {_clientEndPoint} via UDP: {_ex}");
  90. }
  91. }
  92. private static void InitializeServerData()
  93. {
  94. for (int i = 1; i <= MaxPlayers; i++)
  95. {
  96. clients.Add(i, new Client(i));
  97. }
  98. packetHandlers = new Dictionary<int, PacketHandler>()
  99. {
  100. { (int)ClientPackets.welcomeReceived, ServerHandle.WelcomeReceived },
  101. { (int)ClientPackets.playerMovement, ServerHandle.PlayerMovement },
  102. { (int)ClientPackets.playerShoot, ServerHandle.PlayerShoot }
  103. };
  104. Debug.Log("Initialized packets.");
  105. }
  106. public static void Stop()
  107. {
  108. tcpListener.Stop();
  109. udpListener.Close();
  110. }
  111. }