Lua/Python 中的持续 socket 连接

我正在尝试创建一个 Lua 客户端和 Python 服务器之间的持续 socket 连接。实际上,我想要创建一个脚本,该脚本将使用 keepalive 消息不断地向服务器发送 ping。

我的当前问题是每次连接后套接字都会关闭,没有重新打开以进行传输的方法。

Lua 客户端:

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

-- 创建客户端并进行初始连接
client, err = socket.connect(HOST, PORT)
client:setoption('keepalive', true)

-- 每秒尝试向服务器发送 ping
start = os.time()
while true do
  now = os.time()
  if os.difftime(now, start) >= 1 then
    data = client:send("Hello World")
    -- 从服务器接收数据并打印全部内容
    s, status, partial = client:receive()
    print(data, s, status, partial)
    start = now
  end
end

Python 服务器:

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)
        # 发送一些任意数据给客户端
        self.request.sendall(b'1')

if __name__ == '__main__':
    HOST, PORT = "localhost", 9999
    # 创建一个 socketserver 并且永久服务
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        server.serve_forever()

预期结果是每秒钟发送一次 keepalive ping,以确保客户端仍然连接到服务器。

点赞
用户11553028
用户11553028

我最终找到了一个解决方案。

问题似乎出现在 Python 中的 socketserver 库上。我把它换成了原始套接字,然后事情开始按照我想要的方式运行了。从那里,我创建了线程来处理后台的来回交流。

Python 服务器:

import socket, threading

HOST, PORT = "localhost", 9999

# 确保连接仍然活跃
def keepalive(conn, addr):
    print("客户端已连接")
    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("客户端已断开连接")

# 监听连接到服务器的连接,并启动新的 keepalive 线程
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__':
    # 启动套接字服务器
    SERVER = threading.Thread(target=listenForConnections)
    SERVER.start()

    # 在此之后运行任何代码

Lua 客户端在此情况下未更改。

2019-05-26 17:17:44