Перейти к публикации
Форум - ComputerCraft
Гость Nick_Alps

Red Chat. Тема начинающего программиста

Рекомендованные сообщения

Гость Nick_Alps

Всем привет, дорогие друзья!

 

Эта тема открывает проект, посвященный разработке программы для обмена быстрыми сообщениями посредством сети RedNet.

 

Итак, что я планирую реализовать в проекте:

1) Возможность регистрации.

Профиль пользователя содержит:

  • Никнейм
  • Координаты проживания (Можно скрыть)
  • Логин и пароль (Видны только пользователю)
2) Возможность общения в комнатах и в привате (подобно RaidCall).

 

На данный момент я не разработал достаточно прочное представление о принципах работы программы и не приступил к ее написанию, по мере написания кода я буду его выкладывать. Я начинающий программист и приветствую любые замечания в адрес моего кода и проекта в целом.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

и на какой ты стадии??

Вот:

На данный момент я не разработал достаточно прочное представление о принципах работы программы и не приступил к ее написанию, по мере написания кода я буду его выкладывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я думаю используй принцип клиент-сервер , на сервере сделай базу данных там будут записаны логин пароль и тп. все это по надобности передавай клиенту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Nick_Alps

Я думаю используй принцип клиент-сервер , на сервере сделай базу данных там будут записаны логин пароль и тп. все это по надобности передавай клиенту.

это понятно, но как реализовать комнаты? можно в переменную записывать в какой человек сейчас комнате находится и что бы сервер в зависимости от нее переотправлял сообщения. А еще можно реализовать запись переписки в файл на сервере. Блин, трудно без классов однако... На базе классов все очень просто реализовать. посмотрю ролик про ООП еще раз... Не особо понимаю пока еще структуры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Когда то решал задачку отправки электронных писем. Могу выложить если интересно

Как планируешь связывать клиента с сервером если расстояние между ними больше 64?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Nick_Alps

Когда то решал задачку отправки электронных писем. Могу выложить если интересно

Как планируешь связывать клиента с сервером если расстояние между ними больше 64?

Давай, мне интересно. А вот над дальними расстояниями придется призадуматься... может ретрансляторы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Давай, мне интересно. А вот над дальними расстояниями придется призадуматься... может ретрансляторы?

Легко. у меня есть готовый маршрутизатор

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Давай, мне интересно.

http://ridav.oxnull.net/forum/index.php?threads/клиент-сервер-новостей-и-сообщений.19/

Остались нерешенные вопросы:

- связь на дальние расстояния

- защита от перехвата сообщений

- руссификация

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Надо найти время будет, и сесть и разобраться с новым API рэднэта. Защита, хост, имя протокола. Версия КК 1.6.+ , надо будет потестить.

api_rednet.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Nick_Alps

Начал писать программу. В моей версии не получится корректно одновременно регистрировать несколько пользователей. И я использовал чужую функцию RednetOpen()

 

function RednetOpen()
    local sModemSide = nil
        for n,sSide in ipairs( rs.getSides() ) do
            if peripheral.getType( sSide ) == "modem" then 
                sModemSide = sSide
                rednet.open(sModemSide)
                break
            end
        end
        if sModemSide == nil then
            print( "Program stopped.")
            print( "No modem attached." )
            error()
    end
end

function RednetProtect(id)
    while true do
        if id == 1 then
            return true
        else
            return false
        end
        if id == 2 then
            return true
        else
            return false
        end
        if id == 3 then
            return true
        else
            return false
        end
    end
end

function newUser()
local id,message = rednet.receive()
    if RednetProtect(id) then
        if message == 'register' then
            while true do
                local id,message = rednet.receive()
                if RednetProtect(id) then
                    local login = message
                    local id,message = rednet.receive()
                    local password = message
                    local id,message = rednet.receive()
                    local name = message
                end
            end
        end
    end
end

function login()
    while true do
        print('login')
        sleep(5)
    end
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Честно говоря, не совсем понятно, что приведенный код делает.

1) Почему ты считаешь, что одновременно регистрировать несколько пользователей не получится?

2) Функция RednetProtect вернет true если id равно 1 и false в противном случае. До второго ифа она не дойдет. Я так понимаю, она должна проверять id на равенство 1, 2 или 3. Цепочка ифов для этого не лучший вариант. Лучше заведи таблицу. Например так:

validID={[1]=true, [2]=true, [3]=true}
function RednetProtect(id)
  return validID[id]
end
3) Зачем 'register', login, password, name передавать разными пакетами. Гораздо быстрее втиснуть в один и передать одним разом.

4) А где собственно регистрация?

5) Зачем функция login?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Nick_Alps

Не получится регистрировать параллельно, потому что сейчас все данные передаются отдельными пакетами. Я не знаю каким образом разделить строку на несколько переменных, что бы одним пакетом передать. Хотя.. только что дошло, что можно логин и пароль объединять в одну строку и не разделять больше, так и оставить, а вот имя отделить по любому как то надо. Да, функция RednetProtect должна сверять ID, я сомневался в том что она делает это правильно, буду использовать таблицу. Код не завершен. Функция логин здесь лишняя, я использовал ее что бы посмотреть как работает параллельный вызов функций

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не получится регистрировать параллельно, потому что сейчас все данные передаются отдельными пакетами. Я не знаю каким образом разделить строку на несколько переменных, что бы одним пакетом передать. Хотя.. только что дошло, что можно логин и пароль объединять в одну строку и не разделять больше, так и оставить, а вот имя отделить по любому как то надо. Функция RednetProtect именно это и должна делать, я сомневался в том что она делает это правильно, буду использовать таблицу. Код не завершен. Функция логин здесь лишняя, я использовал ее что бы посмотреть как работает параллельный вызов функций

 

можно написать специальный распределитель трафика который будет раскидывать пакеты по сервера

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я не знаю каким образом разделить строку на несколько переменных, что бы одним пакетом передать.

Давай для начала поймем как можно объединять и разделять строки. Строки объединяются просто, при помощи оператора .. (две точки). Он называется конкатенация и просто сливает две строки в одну. Пример: message=login..password

Но разделить, таким образом объединенные, строки однозначно будет невозможно.

Самый простой способ объединения строк, да и любых данных, это поместить их в таблицу, а потом сериализовать, т.е. преобразовать в строку. Пример:

message=textutils.serialize({login,password,name})

На принимающей стороне эту строку можно будет преобразовать снова в таблицу при помощи функции textutils.unserialize(message)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Nick_Alps

Давай для начала поймем как можно объединять и разделять строки. Строки объединяются просто, при помощи оператора .. (две точки). Он называется конкатенация и просто сливает две строки в одну. Пример: message=login..password

Но разделить, таким образом объединенные, строки однозначно будет невозможно.

Самый простой способ объединения строк, да и любых данных, это поместить их в таблицу, а потом сериализовать, т.е. преобразовать в строку. Пример:

message=textutils.serialize({login,password,name})

На принимающей стороне эту строку можно будет преобразовать снова в таблицу при помощи функции textutils.unserialize(message)

Подредактировал код, получилось не очень...

 

trueID={[1]=true, [2]=true, [3]=true}

function RednetProtect(id)
    return trueID[id]
end

function newUser()
while true do
    local id,message = rednet.receive()
        if RednetProtect(id) then
            if message == 'register' then
                local id,message = rednet.receive()
                local user = textutils.unserialize(message)
                for i = 1,3 do
                    local account = fs.open('users/'.. user[1] ..'/login')
                    account.write(user[1])
                    account.close()
                    local account = fs.open('users/'.. user[1] ..'/password')
                    account.write(user[2])
                    account.close()
                    local account = fs.open('users/'.. user[1] ..'/name')
                    account.write(user[3])
                    account.close()
                    end
            end
        end
    end
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Nick_Alps

кажется я не правильно понял принцип textutils.unserialize. Она на свое место возвращает таблицу присланную в сообщении?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может как-то переделать функцию, чтобы она не пыталась выполнить строку, как функцию. И длину #s сразу проверять, чтобы не слали строки в приемник бесконечные (надо знать максимальную длину своих строк). И переписать весь сериалайз/ансериалайз в какой-то отдельный пользовательский общедоступный функционал.

 

Это опасная функция!:D:mad:

function unserialize( s )
    local func = loadstring( "return "..s, "unserialize" )
    if func then
        setfenv( func, {} )
        local ok, result = pcall( func )
        if ok then
            return result
        end
    end
    return nil
end

Подредактировал код, получилось не очень...

function Reception()
local id,message = rednet.receive()
   if RednetProtect(id) then
   local temp_array= textutils.unserialize(message)
            if temp_array[1] == 'register' then
                    AccountCreate(temp_array)
            end
   end
end

function AccountCreate(temp_array)
    login = temp_array[2]
    pass= temp_array[3]
    name= temp_array[4]
    .........
end

 

Отправляете по сети так:

Логин = qwerty

Пароль = 1111

Имя = Вася

 

SendCommand(id_server, {"register", login, password, name} )

 

Вот функция отправки:

 

function SendCommand(ID, data_pre_send)
        data_send = textutils.serialize(data_pre_send)   
        rednet.send(ID, data_send)
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Nick_Alps

Это опасная функция!:D:mad:

 

Чувствую слишком трудную я для своего уровня подготовки задачу поставил

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Чувствую слишком трудную я для своего уровня подготовки задачу поставил

тут сложно нет ничего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Nick_Alps

тут сложно нет ничего.

но нужно знать кучу функций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1 напиши основу взаимодействия сервера с клиентом

2 опиши взаимодействия на сервере (типа если пришел пакет от id такого-то на подключение к чату , то проверить залогинен он или нет , если нет то отправить пакет с ошибкой или не отправлять а просто disconnect ему сделать )

а serialize и unserialize можешь переделать

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я тоже смотрю, что почему-то все начинают в КК писать сразу программы, связанные с роутерами, серверами клиентами и базами данных, а это не самые легкие задачи. При всех тех дырах сетей и прочее. Зачем сразу пытаться написать аналог Одноклассников и ВК. Можно пока поработать с файлами, таблицами, циклами, подать простую команду по сети черепашке, повернуться например. Немножко код научиться разбивать на смысловые блоки и записывать их в функции, как передавать аргументы. Тогда намного легче будет ориентироваться в своем и чужом коде. Ну и АПИ конечно почитать надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость Nick_Alps

Лучше до тех пор пока не наберусь знаний заморожу данный проект, поработаю с черепашками. Посмотрю на различные API.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×