Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- user = {}
- user.__index = user
- -- набор доп-индексов для быстрого поиска
- user.__id_index = {}
- user.__address_index = {}
- user.__sock_index = {}
- user.udp = socket.udp(); user.udp:listen(bla-bla)
- user.tcp = socket.tcp.bind(bla-bla)
- user.udp:settimeout(0) -- блокировки - это плохо
- user.tcp:settimeout(0)
- function user:new(sock, id)
- self = setmetatable({}, self)
- self.sock = sock
- self.id = id
- self.__id_index[id] = self
- self.sock:settimeout(0) -- шоб не блочил
- return self
- end
- -- Когда приконнектится по UDP - обновим
- function user:setAddress(ip, port)
- self.ip = ip
- self.port = port
- self.address_index[ip .. port] = self
- end
- function user:send(data)
- self.sock:send(data)
- end
- function user:fast_send(data)
- self.udp:sendto(data, self.ip, self.port)
- end
- function user:receive_clients()
- -- добавляем новых клиентов по айдишке
- local sock = self.tcp:accept()
- while sock do
- -- конечно, тут ещё всякие проверки
- -- вот тут - блокирующий момент, можно сделать так же как и с udp,
- -- пока клиент не вышлет айдишку - мы не станем его слушаться,
- -- у него есть одна секунда чтобы выслать нам айдишку
- sock:settimeout(1)
- local data = sock:receive('*l')
- local id = json.decode(data).id
- self:new(id, sock) -- мутим клиента
- -- когда соединится по UDP и укажет свой ойпи/порт -
- -- станет настоящим членом общества
- sock = self.tcp:accept()
- end
- end
- function user:receive_data()
- for sock, cli in pairs(self.__sock_index) do
- local data, status = sock:receive('*l')
- while data do
- cli:update(data)
- data = sock:receive('*l')
- end
- if status == 'closed' then
- cli:remove()
- cli:disconnect()
- end
- end
- local data, ip, port = self.udp:receivefrom()
- while data do
- local cli = self.__address_index[ip .. port]
- -- допустим, клиент после подключения по TCP
- -- высылает свою айдишку в цифрах
- -- для дальнейшего подключения
- if cli then
- if tonumber(data) then
- local cli = self.__id_index[data]
- cli:setAddress(ip, port)
- self:connect() -- таки соединился
- end
- else
- cli:update(data)
- end
- data, ip, port = self.udp:receivefrom()
- end
- end
- function user:remove()
- self.__id_index[self.id] = nil
- self.__sock_index[self.sock]
- if self.ip then
- self__address_index[self.ip .. self.port] = nil
- end
- self.sock:close()
- self.sock = nil
- end
- function user:connect()
- print('User ', self.sock:getpeername(), 'connected!')
- -- пользовательская функция
- end
- function user:update(message)
- print('User ', self.sock:getpeername(), 'sends message!')
- -- пользовательская функция
- end
- function user:disconnect()
- print('User ', self.sock:getpeername(), 'disconnected!')
- -- пользовательская функция
- end
- -- Юзание:
- while true do
- user:receive_clients()
- user:receive_data()
- socket.sleep(30)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement