[RakSamp Lite] Связь между lua и python // socket

tripple sixx

Активный
Автор темы
107
49
Версия MoonLoader
Другое
всем ку, хочу связать работу раксампа (его луашника) и питончика, через socket. Написал хуйню, которая нихуя не работает, может у кого-то есть примеры как это правильно сделать?


луааа:
socket = require 'socket'
effil = require 'effil'
require('addon')

local encoding = require("encoding")
encoding.default = 'CP1251'
u8 = encoding.UTF8

function threadHandle(runner, client, resolve, reject)
    local msg, err = client:receive()
    if msg then
        print("Соединение установлено в Lua")
        print("Получено сообщение от клиента:", msg)
    elseif err == 'closed' then
        print('Соединение закрыто')
    else
        print(err)
    end
    client:close()
end

function socketRunner()
    return effil.thread(function(port)
        local socket = require 'socket'
        local server = assert(socket.bind('127.0.0.1', port))
        local client = server:accept()
        return client
    end)
end

function async_socket_request(port, resolve, reject)
    local runner = socketRunner()
    newTask(function()
        local client
        repeat
            client = runner(port):get(0)

        until client

        if client then
            threadHandle(runner, client, resolve, reject)
        else
            print('Не удалось установить соединение в Lua')
        end
    end)
end

function onLoad()
    async_socket_request(8080, function(result)
        print("Получен ответ от сервера:", result)
    end, function(error)
        print("Произошла ошибка:", error)
    end)
end


Python:
import socket

HOST = '127.0.0.1'  # IP-адрес сервера
PORT = 8080         # Порт, который слушает сервер

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client_socket.connect((HOST, PORT))
print("Соединение установлено в Python")

while True:
    message = input("Введите сообщение для отправки на сервер: ")

    client_socket.sendall(message.encode('utf-8'))

    data = client_socket.recv(1024)
    print("Получен ответ от сервера:", data.decode('utf-8'))
 
  • Ха-ха
Реакции: Mintha
Решение
хуйню делаешь
для луа возьми SNET и все будет круто
для питона: перепиши SNET Server с луа, пример на nodejs тебе кинули выше
если просто нужно какие-то запросики кидать (один-два раза) то проще юзать HTTP

kyrtion

Известный
978
355
Записываешь через питончик информацию в файл json, а в луашке каждые секунд 5-10 открываешь его и читаешь.
Есть вероятность что перехватит двух сторон в одном файле и возможно вызовет краш скрипта.
socket, ну это типа как сервер, который открывает локалхост с портом. Запихываешь там запрос POST, луа получает, обрабатывает и вернул ответ "OK"
 

tripple sixx

Активный
Автор темы
107
49
Я не шарю за socket и его возможности.
Я бы сделал так:
Записываешь через питончик информацию в файл json, а в луашке каждые секунд 5-10 открываешь его и читаешь.
как вариант, но там скорей всего куча подводных камней
 

Rice.

Известный
Модератор
1,756
1,622
как вариант, но там скорей всего куча подводных камней
Не вижу проблем, если ты с файла не будешь ничего удалять. Нужно просто добавить в скрипт переменную, в которой будет значение последнего номера ключа таблицы со всеми действиями, чтобы скрипт лишнего не делал.
 

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,798
2,659
Я не шарю за socket и его возможности.
Я бы сделал так:
Записываешь через питончик информацию в файл json, а в луашке каждые секунд 5-10 открываешь его и читаешь.
попахивает костылями, красивее это оформить на сокетах в локалке
 
  • Нравится
Реакции: tripple sixx и DeKzer

tripple sixx

Активный
Автор темы
107
49
Юзай NodeJs + SNet
стопе, у меня проблема с луашником. И есть ли способ обходить эту движуху?
При использование socket приостанавливает прослушку событие в сампе.
Пытался связаться RakSAMP Lite с NodeJS, но из-за socket план превратился в мусор.
 

neverlane

t.me/neverlane00
Друг
1,010
1,159
хуйню делаешь
для луа возьми SNET и все будет круто
для питона: перепиши SNET Server с луа, пример на nodejs тебе кинули выше
если просто нужно какие-то запросики кидать (один-два раза) то проще юзать HTTP
 
  • Нравится
Реакции: chapo и tripple sixx

artemizgame

Известный
29
49
кому не лень, напишите пж функцию async socket, буду очень благодарен!!

Да ты верно подметил что нужен именно асинхронный метод. Но проблема в том, что раксамп работает в одном потоке, и асинхронности там быть не может, только корутины. И да, блокирует корутину именно client:recieve, блокирует он его до того момента пока не получит сообщение. Как мега костыльный, но вариант, можно слать heartbeat packet (если нету другого пакета с полезной нагрузкой). Раксамп получит этот пакет и разблокирует поток до следующего client:recieve.
У меня был заказ, там нужно было использовать вебсокеты, и я даже думал делать этот ужасный костыль, но потом до меня доперло как сделать это +- нормально:
Луа же поддерживает библиотеки с++, а с++ поддерживает и потоки и асинхронность, что еще надо? Делегируем этот злосчастный client:recieve на библиотеку. Я не знаю, будет ли готовая библиотека которая подойдет под твою задачу, под мою не было, я и с 0 (формально, я конечно почитал как передавать функции в луа, как их вызывать) написал библиотеку. Немного деталей, описание работы связки lua+ws:

1) Луа передает строку (адрес) подключения к библиотеке с++
2) Библиотека подключается по строке, записывает класс подключения в свои глобальные переменные (когда я это делал, у меня были мысли что это анти-паттерн, но кто видит?)
3) Библиотека делает client recieve в своем потоке (отдельном треде), и записывает результат в очередь (есть такая коллекция, почитай)
4) Луа в корутине вызывает библиотеку local lastMsg = biblnName.GetMessage()
5) Библиотека возвращает последний элемент из очереди если он есть, если нету то null (nil)
6) ???
7) PROFIT
Screenshot_18.png

Screenshot_17.png