Event.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. /**
  3. *
  4. *
  5. * @author walkor <workerman.net>
  6. *
  7. */
  8. require_once ROOT_DIR . '/Lib/Gateway.php';
  9. class Event
  10. {
  11. /**
  12. * 用户连接gateway后第一次发包会触发此方法
  13. * @param string $message 一般是传递的账号密码等信息
  14. * @return void
  15. */
  16. public static function onConnect($message)
  17. {
  18. // 通过message验证用户,并获得uid
  19. $uid = self::checkUser($message);
  20. // 不合法踢掉
  21. if(!$uid)
  22. {
  23. // 返回失败
  24. return GateWay::kickCurrentUser('登录失败');
  25. }
  26. // [这步是必须的]合法,记录uid到gateway通信地址的映射
  27. GateWay::storeUid($uid);
  28. // [这步是必须的]发送数据包到address对应的gateway,确认connection成功
  29. GateWay::notifyConnectionSuccess($uid);
  30. // 向当前用户发送uid
  31. GateWay::sendToCurrentUid(json_encode(array('uid'=>$uid))."\n");
  32. // 广播所有用户,xxx connected
  33. GateWay::sendToAll(json_encode(array('from_uid'=>'SYSTEM', 'message'=>"$uid come \n", 'to_uid'=>'all'))."\n");
  34. }
  35. /**
  36. * 当用户断开连接时触发的方法
  37. * @param string $address 和该用户gateway通信的地址
  38. * @param integer $uid 断开连接的用户id
  39. * @return void
  40. */
  41. public static function onClose($uid)
  42. {
  43. // [这步是必须的]删除这个用户的gateway通信地址
  44. GateWay::deleteUidAddress($uid);
  45. // 广播 xxx 退出了
  46. GateWay::sendToAll(json_encode(array('from_uid'=>'SYSTEM', 'message'=>"$uid logout\n", 'to_uid'=>'all'))."\n");
  47. }
  48. /**
  49. * 有消息时触发该方法
  50. * @param int $uid 发消息的uid
  51. * @param string $message 消息
  52. * @return void
  53. */
  54. public static function onMessage($uid, $message)
  55. {
  56. $message_data = json_decode($message, true);
  57. // 向所有人发送
  58. if($message_data['to_uid'] == 'all')
  59. {
  60. return GateWay::sendToAll($message);
  61. }
  62. // 向某个人发送
  63. else
  64. {
  65. return GateWay::sendToUid($message_data['to_uid'], $message);
  66. }
  67. }
  68. /**
  69. * 用户第一次链接时,根据用户传递的消息(一般是用户名 密码)返回当前uid
  70. * 这里只是返回了时间戳相关的一个数字
  71. * @param string $message
  72. * @return number
  73. */
  74. protected static function checkUser($message)
  75. {
  76. return substr(strval(microtime(true)), 3, 10)*100;
  77. }
  78. }