PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/Soutenance_finale/eradiKor/Network/Connections.cs

http://xe8tmw7c.googlecode.com/
C# | 273 lines | 218 code | 32 blank | 23 comment | 91 complexity | 8737cfe2c7f0b048f9f9192666b86790 MD5 | raw file
Possible License(s): GPL-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Microsoft.Xna.Framework;
  6. using Lidgren.Network;
  7. namespace eradiKor.Network
  8. {
  9. #region enum
  10. public enum WireType
  11. {
  12. Auto,
  13. Search,
  14. Direct,
  15. CreateServ,
  16. GetInfo
  17. }
  18. #endregion
  19. public class Connections
  20. {
  21. const int NBTRYMAX = 2;
  22. const int DEFAULTPORT = 42422;
  23. #region Attributs
  24. private WireConf wConf;
  25. private NetClient client;
  26. private NetBuffer netBuffer;
  27. private Network.Server serv;
  28. private List<System.Net.IPEndPoint> discovered;
  29. private string map;
  30. public Queue<string> sysMess { get; private set; }
  31. public Queue<NetMessage> inData { get; private set; }
  32. public Queue<NetMessage> outData { get; private set; }
  33. #endregion
  34. #region Constructeur
  35. public Connections(NetType nT, WireType wT,
  36. string i, int p, string n, GameTime gametime, string mapstr)
  37. {
  38. this.wConf = new WireConf(nT, wT,
  39. new NetConfiguration("eradiKor"), p, i, n);
  40. this.discovered = new List<System.Net.IPEndPoint>();
  41. this.sysMess = new Queue<string>();
  42. this.map = mapstr;
  43. if (this.wConf.WType == WireType.CreateServ)
  44. //il faut lui laisser le temps de s’initialiser
  45. //la connexion sera assurée par update plus tard
  46. init_serv(gametime, mapstr);
  47. else
  48. init_client(gametime);
  49. this.inData = new Queue<NetMessage>();
  50. this.outData = new Queue<NetMessage>();
  51. }
  52. #endregion
  53. #region Accesseurs
  54. /// <summary>
  55. /// Statut de la connection
  56. /// </summary>
  57. public NetConnectionStatus status
  58. {
  59. get { return this.client.Status; }
  60. }
  61. public int Id
  62. {
  63. get { return this.wConf.Id; }
  64. }
  65. public List<System.Net.IPEndPoint> Discovered
  66. {
  67. get { return this.discovered; }
  68. }
  69. public WireType Type
  70. {
  71. get { return this.wConf.WType; }
  72. }
  73. #endregion
  74. #region Méthodes
  75. public void update(Structures.GameData datas, GameTime gametime)
  76. {
  77. //update du serveur, s’il y en a un de lancé
  78. // + récupérations des éventuels messages systčmes
  79. // (update renvoie une Queue<string> de messages systčmes)
  80. if (this.wConf.IsServer && this.serv.Ready)
  81. {
  82. Queue<string> aux = this.serv.update((float)gametime.TotalRealTime.TotalSeconds);
  83. foreach (string s in aux)
  84. this.sysMess.Enqueue(s);
  85. }
  86. NetMessageType messType;
  87. if (client != null)
  88. {
  89. //avertissement de changement de statut de la connexion
  90. if (this.client.Status != this.wConf.LastStatus)
  91. {
  92. this.wConf.LastStatus = this.client.Status;
  93. if (this.wConf.LastStatus == NetConnectionStatus.Connected)
  94. this.sysMess.Enqueue("Connecté");
  95. else if (this.wConf.LastStatus == NetConnectionStatus.Connecting)
  96. this.sysMess.Enqueue("Connexion en cours");
  97. else if (this.wConf.LastStatus == NetConnectionStatus.Disconnected)
  98. this.sysMess.Enqueue("Déconnecté");
  99. else if (this.wConf.LastStatus == NetConnectionStatus.Disconnecting)
  100. this.sysMess.Enqueue("Déconnexion en cours");
  101. else if (this.wConf.LastStatus == NetConnectionStatus.Reconnecting)
  102. this.sysMess.Enqueue("Reconnexion en cours");
  103. }
  104. while (client.ReadMessage(this.netBuffer, out messType))
  105. {
  106. if (messType == NetMessageType.ServerDiscovered)
  107. {
  108. if (this.wConf.WType == WireType.Auto && this.client.Status != NetConnectionStatus.Connected && this.client.Status != NetConnectionStatus.Connecting)
  109. {
  110. this.sysMess.Enqueue("Serveur trouvé");
  111. this.client.Connect(this.netBuffer.ReadIPEndPoint());
  112. }
  113. else if (this.wConf.WType == WireType.Search)
  114. this.discovered.Add(this.netBuffer.ReadIPEndPoint());
  115. }
  116. //des données ! voyons voir ce que c’est ...
  117. else if (messType == NetMessageType.Data)
  118. {
  119. //Parsing des données en arrivage
  120. NetMessage aux = new NetMessage(this.netBuffer.ReadString());
  121. //quoi que ce soit,on se l’enfile dans inData
  122. this.inData.Enqueue(aux);
  123. //traitement selon les différents types de données
  124. if (aux.Type == MessageType.None)
  125. this.sysMess.Enqueue(aux.Content);
  126. else if (aux.Type == MessageType.Ping)
  127. {
  128. //mise a jour de notre propre id, si on ne l'a pas encore
  129. if (this.wConf.Id == 0 && aux.Id != 0)
  130. this.wConf.Id = aux.Id;
  131. //réponse instantannée au ping, sans passer par outData
  132. this.sendData((new NetMessage(MessageType.Ping, this.wConf.Id, "")).NetString);
  133. }
  134. else if (aux.Type == MessageType.System)
  135. {
  136. string[] splitted = aux.Content.Split(new char[] { ':' });
  137. if (splitted.Length >= 2)
  138. {
  139. int toparse = 0;
  140. int.TryParse(splitted[0], out toparse);
  141. SystemActions ty = NetParsers.parseSysAct(toparse);
  142. if (ty == SystemActions.Disconnect)
  143. {
  144. int concerned = 0;
  145. int.TryParse(splitted[1], out concerned);
  146. if (concerned == this.Id)
  147. //then, c’est grave
  148. Kore.Structures.Events.Critical.Enqueue(Kore.Structures.EventType.str);
  149. }
  150. }
  151. }//if (données systčme)
  152. }//if (données)
  153. }// while(messages)
  154. //Maintenant qu’on a paré tous les coups que le serveur nous a
  155. //envoyé, ŕ nous de riposter ! Tatata !
  156. if (this.client.Status == NetConnectionStatus.Connected)
  157. while (this.outData.Count > 0)
  158. this.sendData(this.outData.Dequeue().NetString);
  159. }
  160. //comment ça la connexion n’est pas active ?
  161. //allez hop, au boulot ! nan mais oh...
  162. if (this.wConf.LastTry + 3 < gametime.TotalRealTime.TotalSeconds && (client == null || this.client.Status != NetConnectionStatus.Connected))
  163. init_client(gametime);
  164. }
  165. private void sendData(string str)
  166. {
  167. if (this.client != null && this.client.Status == NetConnectionStatus.Connected)
  168. {
  169. NetBuffer outBuffer = new NetBuffer();
  170. outBuffer.Write(str);
  171. this.client.SendMessage(outBuffer, NetChannel.ReliableInOrder1);
  172. }
  173. }
  174. public void init_client(GameTime gametime)
  175. {
  176. if (this.client == null)
  177. {
  178. this.wConf.NetConf = new NetConfiguration("eradiKor");
  179. //this.wConf.NetConf.Port = this.wConf.Port;
  180. this.client = new NetClient(this.wConf.NetConf);
  181. this.client.Start();
  182. }
  183. //connexion en fonction du mode choisi
  184. if (this.wConf.WType == WireType.CreateServ)
  185. //le serveur a été initialisé par le constructeur
  186. this.client.Connect("127.0.0.1", this.wConf.Port);
  187. else if (this.wConf.WType == WireType.Direct)
  188. {
  189. if (this.wConf.NbTry >= NBTRYMAX && !this.wConf.IsServer)
  190. {
  191. if (this.client != null)
  192. {
  193. this.client.Disconnect("");
  194. this.client.Dispose();
  195. }
  196. Kore.Structures.Events.addCriticalEvent(Kore.Structures.EventType.multiCantConnect);
  197. }
  198. else
  199. this.client.Connect(this.wConf.Ip, this.wConf.Port);
  200. }
  201. else if (this.wConf.WType == WireType.Search)
  202. {
  203. this.discovered.Clear();
  204. this.client.DiscoverLocalServers(this.wConf.Port);
  205. }
  206. else if (wConf.WType == WireType.GetInfo)
  207. this.client.Connect(this.wConf.Ip, this.wConf.Port);
  208. else if (this.wConf.WType == WireType.Auto)
  209. { //le plus chiant !
  210. if (this.wConf.NbTry >= NBTRYMAX && !this.wConf.IsServer)
  211. init_serv(gametime, this.map);
  212. else
  213. {
  214. this.sysMess.Enqueue("Recherche de serveur");
  215. this.client.DiscoverLocalServers(this.wConf.Port);
  216. }
  217. }
  218. this.wConf.NbTry++;
  219. this.netBuffer = this.client.CreateBuffer();
  220. this.wConf.LastTry = (float)gametime.TotalRealTime.TotalSeconds;
  221. }
  222. public void init_serv(GameTime gametime, string map)
  223. {
  224. this.sysMess.Enqueue("Initialisation du serveur");
  225. this.wConf.NetConf.Port = this.wConf.Port;
  226. this.wConf.NetConf.MaxConnections = 128;
  227. this.wConf.NetConf.TimeoutDelay = 5;
  228. this.serv = new Server(this.wConf.NetConf, this.wConf.NType, map);
  229. this.wConf.LastTry = (float)gametime.TotalRealTime.TotalSeconds;
  230. this.wConf.IsServer = true;
  231. }
  232. public void dispose()
  233. {
  234. if (this.wConf.IsServer && this.serv != null)
  235. this.serv.dispose();
  236. this.client.Disconnect("");
  237. this.client.Dispose();
  238. }
  239. #endregion
  240. }
  241. }