Advertisement
Snusmumriken

Lua user handle example

Jul 2nd, 2018
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.32 KB | None | 0 0
  1. user = {}
  2. user.__index = user
  3. -- набор доп-индексов для быстрого поиска
  4. user.__id_index = {}
  5. user.__address_index = {}
  6. user.__sock_index = {}
  7.  
  8. user.udp = socket.udp(); user.udp:listen(bla-bla)
  9. user.tcp = socket.tcp.bind(bla-bla)
  10. user.udp:settimeout(0) -- блокировки - это плохо
  11. user.tcp:settimeout(0)
  12.  
  13. function user:new(sock, id)
  14.     self = setmetatable({}, self)
  15.     self.sock = sock
  16.     self.id = id
  17.     self.__id_index[id] = self
  18.     self.sock:settimeout(0) -- шоб не блочил
  19.     return self
  20. end
  21.  
  22. -- Когда приконнектится по UDP - обновим
  23. function user:setAddress(ip, port)
  24.     self.ip = ip
  25.     self.port = port
  26.     self.address_index[ip .. port] = self
  27. end
  28.  
  29. function user:send(data)
  30.     self.sock:send(data)
  31. end
  32.  
  33. function user:fast_send(data)
  34.     self.udp:sendto(data, self.ip, self.port)
  35. end
  36.  
  37. function user:receive_clients()
  38.     -- добавляем новых клиентов по айдишке
  39.     local sock = self.tcp:accept()
  40.     while sock do
  41.          -- конечно, тут ещё всякие проверки
  42.  
  43.         -- вот тут - блокирующий момент, можно сделать так же как и с udp,
  44.         -- пока клиент не вышлет айдишку - мы не станем его слушаться,
  45.         -- у него есть одна секунда чтобы выслать нам айдишку
  46.         sock:settimeout(1)
  47.         local data = sock:receive('*l')
  48.         local id = json.decode(data).id
  49.         self:new(id, sock) -- мутим клиента
  50.         -- когда соединится по UDP и укажет свой ойпи/порт -
  51.         -- станет настоящим членом общества
  52.         sock = self.tcp:accept()
  53.     end
  54. end
  55.  
  56. function user:receive_data()
  57.     for sock, cli in pairs(self.__sock_index) do
  58.         local data, status = sock:receive('*l')
  59.         while data do
  60.             cli:update(data)
  61.             data = sock:receive('*l')
  62.         end
  63.         if status == 'closed' then
  64.             cli:remove()
  65.             cli:disconnect()
  66.         end
  67.     end
  68.    
  69.     local data, ip, port = self.udp:receivefrom()
  70.     while data do
  71.         local cli = self.__address_index[ip .. port]
  72.        
  73.         -- допустим, клиент после подключения по TCP
  74.         -- высылает свою айдишку в цифрах
  75.         -- для дальнейшего подключения
  76.         if cli then
  77.             if tonumber(data) then
  78.                 local cli = self.__id_index[data]
  79.                 cli:setAddress(ip, port)
  80.                 self:connect() -- таки соединился
  81.             end
  82.         else
  83.             cli:update(data)
  84.         end
  85.         data, ip, port = self.udp:receivefrom()
  86.     end
  87. end
  88.  
  89. function user:remove()
  90.     self.__id_index[self.id] = nil
  91.     self.__sock_index[self.sock]
  92.     if self.ip then
  93.         self__address_index[self.ip .. self.port] = nil
  94.     end
  95.     self.sock:close()
  96.     self.sock = nil
  97. end
  98.  
  99. function user:connect()
  100.     print('User ', self.sock:getpeername(), 'connected!')
  101.     -- пользовательская функция
  102. end
  103.  
  104. function user:update(message)
  105.     print('User ', self.sock:getpeername(), 'sends message!')
  106.     -- пользовательская функция
  107. end
  108.  
  109. function user:disconnect()
  110.     print('User ', self.sock:getpeername(), 'disconnected!')
  111.     -- пользовательская функция
  112. end
  113.  
  114. -- Юзание:
  115.  
  116. while true do
  117.     user:receive_clients()
  118.     user:receive_data()
  119.     socket.sleep(30)
  120. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement