将http轮询改为 长轮询请求挂起
This commit is contained in:
122
Client/main.lua
122
Client/main.lua
@@ -25,7 +25,7 @@ function table_to_json(t, indent)
|
||||
indent = indent or 0
|
||||
local spaces = string.rep(" ", indent)
|
||||
local result = {}
|
||||
|
||||
|
||||
if type(t) ~= "table" then
|
||||
if type(t) == "string" then
|
||||
-- 正确转义所有特殊字符
|
||||
@@ -48,7 +48,7 @@ function table_to_json(t, indent)
|
||||
return '"' .. tostring(t) .. '"'
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- 检查是否是数组
|
||||
local is_array = true
|
||||
local max_index = 0
|
||||
@@ -62,12 +62,12 @@ function table_to_json(t, indent)
|
||||
max_index = k
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- 空表当作对象处理
|
||||
if count == 0 then
|
||||
is_array = false
|
||||
end
|
||||
|
||||
|
||||
if is_array then
|
||||
-- 处理数组
|
||||
table.insert(result, "[")
|
||||
@@ -102,7 +102,7 @@ function table_to_json(t, indent)
|
||||
table.insert(result, "}")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
return table.concat(result, indent > 0 and "\n" .. spaces or "")
|
||||
end
|
||||
|
||||
@@ -113,23 +113,30 @@ end
|
||||
local function httpPost(path, data)
|
||||
local jsonData = table_to_json(data)
|
||||
local url = httpServer .. path
|
||||
|
||||
local response = http.post(url, jsonData, {
|
||||
["Content-Type"] = "application/json"
|
||||
|
||||
-- 使用长轮询,设置超时时间为300秒
|
||||
local response,err = http.post({
|
||||
url = url,
|
||||
body = jsonData,
|
||||
method = "POST",
|
||||
headers = {
|
||||
["Content-Type"] = "application/json"
|
||||
},
|
||||
timeout = 300 -- 300秒超时
|
||||
})
|
||||
|
||||
|
||||
if not response then
|
||||
return nil, "无法连接到服务器"
|
||||
return nil, "0 "..err
|
||||
end
|
||||
|
||||
|
||||
local responseBody = response.readAll()
|
||||
response.close()
|
||||
|
||||
|
||||
local ok, result = pcall(textutils.unserialiseJSON, responseBody)
|
||||
if ok then
|
||||
return result
|
||||
else
|
||||
return nil, "无效的JSON响应"
|
||||
return nil, "1无效的JSON响应: " .. responseBody
|
||||
end
|
||||
end
|
||||
|
||||
@@ -148,7 +155,7 @@ local function getFiles(currentPath, result, prefix)
|
||||
local computerPrefix = "computer_" .. computerID
|
||||
local fullPrefix = currentPath == "" and prefix:sub(1, -2) or prefix .. currentPath
|
||||
local absPath = "/" .. (currentPath == "" and "" or currentPath)
|
||||
|
||||
|
||||
if fs.isDir(absPath) then
|
||||
result[fullPrefix] = { isFolder = true }
|
||||
for _, entry in ipairs(fs.list(absPath)) do
|
||||
@@ -292,10 +299,13 @@ end
|
||||
|
||||
local function sendResponse(response)
|
||||
if response and roomId then
|
||||
httpPost("/api/client/send", {
|
||||
local result, err = httpPost("/api/client/send", {
|
||||
room_id = roomId,
|
||||
message = response
|
||||
})
|
||||
if not result then
|
||||
log("3 发送响应失败: " .. tostring(err))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -305,52 +315,56 @@ local function pollMessages()
|
||||
sleep(pollInterval)
|
||||
break
|
||||
end
|
||||
|
||||
|
||||
local result, err = httpPost("/api/client/receive", {
|
||||
room_id = roomId
|
||||
})
|
||||
|
||||
if result and result.success and result.message then
|
||||
|
||||
if result and result.success then
|
||||
local msg = result.message
|
||||
local msgType = msg.type
|
||||
|
||||
if msgType == "file_operation" or msgType == "file_operation_request" then
|
||||
local op = msg.operation_type or msg.type
|
||||
local data = msg.data or {}
|
||||
local reqId = msg.requestId or msg.request_id
|
||||
local sender = msg.sender_id
|
||||
|
||||
local response
|
||||
|
||||
if op == "fetch_files" then
|
||||
response = handleFetchFiles(reqId, sender)
|
||||
elseif op == "create_or_save_file" then
|
||||
response = handleSaveFile(data, reqId, sender)
|
||||
elseif op == "new_file" then
|
||||
response = handleCreateFile(data, reqId, sender)
|
||||
elseif op == "new_folder" then
|
||||
response = handleCreateFolder(data, reqId, sender)
|
||||
elseif op == "rename" then
|
||||
response = handleRename(data, reqId, sender)
|
||||
elseif op == "delete_file" then
|
||||
response = handleDelete(data, reqId, sender)
|
||||
else
|
||||
response = {
|
||||
type = "file_operation_response",
|
||||
requestId = reqId,
|
||||
success = false,
|
||||
error = "Unknown operation: " .. tostring(op),
|
||||
target_client_id = sender
|
||||
}
|
||||
log(msg)
|
||||
if msg then
|
||||
local msgType = msg.type
|
||||
|
||||
if msgType == "file_operation" or msgType == "file_operation_request" then
|
||||
local op = msg.operation_type or msg.type
|
||||
local data = msg.data or {}
|
||||
local reqId = msg.requestId or msg.request_id
|
||||
local sender = msg.sender_id
|
||||
|
||||
local response
|
||||
|
||||
if op == "fetch_files" then
|
||||
response = handleFetchFiles(reqId, sender)
|
||||
elseif op == "create_or_save_file" then
|
||||
response = handleSaveFile(data, reqId, sender)
|
||||
elseif op == "new_file" then
|
||||
response = handleCreateFile(data, reqId, sender)
|
||||
elseif op == "new_folder" then
|
||||
response = handleCreateFolder(data, reqId, sender)
|
||||
elseif op == "rename" then
|
||||
response = handleRename(data, reqId, sender)
|
||||
elseif op == "delete_file" then
|
||||
response = handleDelete(data, reqId, sender)
|
||||
else
|
||||
response = {
|
||||
type = "file_operation_response",
|
||||
requestId = reqId,
|
||||
success = false,
|
||||
error = "Unknown operation: " .. tostring(op),
|
||||
target_client_id = sender
|
||||
}
|
||||
end
|
||||
|
||||
sendResponse(response)
|
||||
end
|
||||
|
||||
sendResponse(response)
|
||||
end
|
||||
elseif err then
|
||||
log("轮询错误: " .. tostring(err))
|
||||
log("2 轮询错误: " .. tostring(err))
|
||||
-- 如果是连接错误,稍后再试
|
||||
sleep(5)
|
||||
end
|
||||
|
||||
sleep(pollInterval)
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -369,7 +383,7 @@ local function main()
|
||||
os.queueEvent("mouse_click",1,1,1)
|
||||
-- 启动消息轮询
|
||||
mainFrame:addThread():start(pollMessages)
|
||||
|
||||
|
||||
log("客户端已启动。房间ID: " .. roomId)
|
||||
log("计算机ID: " .. computerID)
|
||||
log("按 Q 退出")
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
import tomllib
|
||||
|
||||
# 您的 TOML 字符串
|
||||
toml_str = '''{ a = "你好", "a-c-v" = "你好", b = "世界", }'''
|
||||
|
||||
# 反序列化
|
||||
data = tomllib.loads(toml_str)
|
||||
print(data)
|
||||
# 输出: {'a': '你好', 'a-c-v': '你好', 'b': '世界'}
|
||||
|
||||
# 访问数据
|
||||
print(data['a']) # 输出: 你好
|
||||
print(data['a-c-v']) # 输出: 你好
|
||||
Reference in New Issue
Block a user