Постоянное сокетное соединение в Lua / Python - PullRequest
1 голос
/ 25 мая 2019

Я пытаюсь создать постоянное сокетное соединение между клиентом Lua и сервером Python.По сути, скрипт, который будет постоянно пинговать сервер сообщениями keepalive

Моя текущая проблема заключается в том, что сокет закрывается после каждого соединения без возможности повторного открытия его для передачи.

Lua Client:

local HOST, PORT = "localhost", 9999
local socket = require('socket')

-- Create the client and initial connection
client, err = socket.connect(HOST, PORT)
client:setoption('keepalive', true)

-- Attempt to ping the server once a second
start = os.time()
while true do
  now = os.time()
  if os.difftime(now, start) >= 1 then
    data = client:send("Hello World")
    -- Receive data from the server and print out everything
    s, status, partial = client:receive()
    print(data, s, status, partial)
    start = now
  end
end

Python Server:

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print("{} wrote".format(self.client_address[0]))
        print(self.data)
        print(self.client_address)
        # Send back some arbitrary data
        self.request.sendall(b'1')

if __name__ == '__main__':
    HOST, PORT = "localhost", 9999
    # Create a socketserver and serve is forever
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        server.serve_forever()

Ожидаемый результат - пинг подтверждения активности каждую секунду, чтобы гарантировать, что клиент все еще подключен к серверу.

1 Ответ

0 голосов
/ 26 мая 2019

Я закончил тем, что нашел решение.

Проблема, похоже, была с библиотекой socketserver в Python.Я переключил его на необработанные розетки, и все стало работать так, как я хотел.Оттуда я создал потоки для обработки в фоновом режиме

Python Server:

import socket, threading

HOST, PORT = "localhost", 9999

# Ensures the connection is still active
def keepalive(conn, addr):
    print("Client connected")
    with conn:
        conn.settimeout(3)
        while True:
            try:
                data = conn.recv(1024)
                if not data: break
                message = data.split(b',')
                if message[0] == b'ping':
                    conn.sendall(b'pong' + b'\n')
            except Exception as e:
                break
        print("Client disconnected")

# Listens for connections to the server and starts a new keepalive thread
def listenForConnections():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        sock.bind((HOST, PORT))
        while True:
            sock.listen()
            conn, addr = sock.accept()
            t = threading.Thread(target=keepalive, args=(conn, addr))
            t.start()

if __name__ == '__main__':
    # Starts up the socket server
    SERVER = threading.Thread(target=listenForConnections)
    SERVER.start()

    # Run whatever code after this

Lua-клиент не изменился в этом сценарии

...