• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共151篇

    Unity - 游戏引擎

关闭

返回栏目

关闭

返回Unity - 游戏引擎栏目

91 - Server - Client.cs - 客户端连接器

作者:

贺及楼

成为作者

更新日期:2023-09-17 10:57:22

  1. class Client
  2. {
  3. private Socket clientSocket;
  4. private Server server;
  5. private Message msg = new Message();
  6. private MySqlConnection mysqlConn;
  7. private Room room;
  8. private User user;//保存用户
  9. private Result result;//保存战绩
  10. private ResultDAO resultDAO = new ResultDAO();
  11. public int HP{get;set;}
  12. public bool TakeDamage(int damage){}
  13. public bool IsDie(){}
  14. public MySqlConnection MySQLConn{}
  15. public void SetUserData(User user,Result result){}
  16. public string GetUserData(){}
  17. public Room Room{set { room = value; }get { return room; }}
  18. public int GetUserId(){}
  19. //新建一个Client客户端
  20. public Client() { }//构造方法
  21. public Client(Socket clientSocket,Server server) {}
  22. //开启监听
  23. public void Start() {}
  24. //_开启监听:接收数据Callback
  25. private void ReceiveCallback(IAsyncResult ar) {}
  26. //_获得数据给server
  27. private void OnProcessMessage(请求码,动作码,数据){}
  28. //_关闭Socket
  29. private void Close(){}
  30. //发送信息给客户端
  31. public void Send(动作码, 数据){}
  32. public bool IsHouseOwner(){}
  33. public void UpdateResult(bool isVictory){}
  34. private void UpdateResultToDB(bool isVictory){}
  35. private void UpdateResultToClient(){}
  36. }
  1. class Client
  2. {
  3. private Socket clientSocket;
  4. private Server server;
  5. private Message msg = new Message();
  6. private MySqlConnection mysqlConn;
  7. private Room room;
  8. private User user;//保存用户
  9. private Result result;//保存战绩
  10. private ResultDAO resultDAO = new ResultDAO();
  11. public int HP{get;set;}
  12. public bool TakeDamage(int damage){}
  13. public bool IsDie(){}
  14. public MySqlConnection MySQLConn{}
  15. public void SetUserData(User user,Result result){}
  16. public string GetUserData(){}
  17. public Room Room{set { room = value; }get { return room; }}
  18. public int GetUserId(){}
  19. //新建一个Client客户端
  20. public Client() { }//构造方法
  21. public Client(Socket clientSocket,Server server) {}
  22. //开启监听
  23. public void Start() {}
  24. //_开启监听:接收数据Callback
  25. private void ReceiveCallback(IAsyncResult ar) {}
  26. //_获得数据给server
  27. private void OnProcessMessage(RequestCode requestCode,ActionCode actionCode,string data){}
  28. //_关闭Socket
  29. private void Close(){}
  30. //发送信息给客户端
  31. public void Send(ActionCode actionCode, string data){}
  32. public bool IsHouseOwner(){}
  33. public void UpdateResult(bool isVictory){}
  34. private void UpdateResultToDB(bool isVictory){}
  35. private void UpdateResultToClient(){}
  36. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Net.Sockets;
  7. using Common;
  8. using MySql.Data.MySqlClient;
  9. using GameServer.Tool;
  10. using GameServer.Model;
  11. using GameServer.DAO;
  12. namespace GameServer.Servers
  13. {
  14. class Client
  15. {
  16. private Socket clientSocket;
  17. private Server server;
  18. private Message msg = new Message();
  19. private MySqlConnection mysqlConn;
  20. private Room room;
  21. private User user;//保存用户
  22. private Result result;//保存战绩
  23. private ResultDAO resultDAO = new ResultDAO();
  24. public int HP
  25. {
  26. get;set;
  27. }
  28. public bool TakeDamage(int damage)
  29. {
  30. HP -= damage;
  31. HP = Math.Max(HP, 0);
  32. if (HP <= 0) return true;
  33. return false;
  34. }
  35. public bool IsDie()
  36. {
  37. return HP <= 0;
  38. }
  39. public MySqlConnection MySQLConn
  40. {
  41. get { return mysqlConn; }
  42. }
  43. public void SetUserData(User user,Result result)
  44. {
  45. this.user = user;
  46. this.result = result;
  47. }
  48. public string GetUserData()
  49. {
  50. return user.Id+","+ user.Username + "," + result.TotalCount + "," + result.WinCount;
  51. }
  52. public Room Room
  53. {
  54. set { room = value; }
  55. get { return room; }
  56. }
  57. public int GetUserId()
  58. {
  59. return user.Id;
  60. }
  61. //新建一个Client客户端
  62. public Client() { }//构造方法
  63. public Client(Socket clientSocket,Server server)
  64. {
  65. this.clientSocket = clientSocket;
  66. this.server = server;
  67. mysqlConn = ConnHelper.Connect();
  68. }
  69. //开启监听
  70. public void Start()
  71. {
  72. if (clientSocket == null || clientSocket.Connected == false) return;
  73. clientSocket.BeginReceive(msg.Data, msg.StartIndex, msg.RemainSize, SocketFlags.None, ReceiveCallback, null);//开启监听
  74. }
  75. //_开启监听:接收数据Callback
  76. private void ReceiveCallback(IAsyncResult ar)
  77. {
  78. try
  79. {
  80. if (clientSocket == null || clientSocket.Connected == false) return;
  81. int count = clientSocket.EndReceive(ar);
  82. if (count == 0)
  83. {
  84. Close();//断开连接
  85. }
  86. msg.ReadMessage(count,OnProcessMessage);//_获得数据
  87. Start();//开启监听,造成循环监听,处理message消息
  88. }
  89. catch (Exception e)
  90. {
  91. Console.WriteLine(e);
  92. Close();
  93. }
  94. }
  95. //_获得数据给server
  96. private void OnProcessMessage(RequestCode requestCode,ActionCode actionCode,string data)
  97. {
  98. server.HandleRequest(requestCode, actionCode, data, this);
  99. }
  100. //_关闭Socket
  101. private void Close()
  102. {
  103. ConnHelper.CloseConnection(mysqlConn);//关闭数据库
  104. if (clientSocket != null)
  105. clientSocket.Close();
  106. if (room != null)
  107. {
  108. room.QuitRoom(this);
  109. }
  110. server.RemoveClient(this);//_移除断开连线的客户端:server调用
  111. }
  112. //发送信息给客户端
  113. public void Send(ActionCode actionCode, string data)
  114. {
  115. try
  116. {
  117. byte[] bytes = Message.PackData(actionCode, data);
  118. clientSocket.Send(bytes);
  119. }catch(Exception e)
  120. {
  121. Console.WriteLine("无法发送消息:" + e);
  122. }
  123. }
  124. public bool IsHouseOwner()
  125. {
  126. return room.IsHouseOwner(this);
  127. }
  128. public void UpdateResult(bool isVictory)
  129. {
  130. UpdateResultToDB(isVictory);
  131. UpdateResultToClient();
  132. }
  133. private void UpdateResultToDB(bool isVictory)
  134. {
  135. result.TotalCount++;
  136. if (isVictory)
  137. {
  138. result.WinCount++;
  139. }
  140. resultDAO.UpdateOrAddResult(mysqlConn, result);
  141. }
  142. private void UpdateResultToClient()
  143. {
  144. Send(ActionCode.UpdateResult, string.Format("{0},{1}", result.TotalCount, result.WinCount));
  145. }
  146. }
  147. }