클 라 이언 트 와 백 엔 드 의 상호작용 에 남 겨 진 문제
저희 가 lua 에서 어떻게 해 야 되 죠?해결 방법 을 알려 드 리 겠 습 니 다.
local __buffer = ""
local function unpack_package(packet)
local size = #packet
-- trace("total size:"..size)
--
if size < 2 then
return nil, packet
end
local s = packet:byte(1) * 256 + packet:byte(2)
-- trace("body size:"..s)
--
if size < s+2 then
return nil, packet
end
return packet:sub(3,2+s), packet:sub(3+s)
end
local function recv_package(last)
local result, last = unpack_package(last)
if result then
return result, last
end
return nil, last
end
function NetworkManager:onData(event)
-- trace("pre __buffer:" .. #__buffer) --
if event.data == "" then
trace("socket closed")
return
end
__buffer = __buffer .. event.data
-- , ( )
while true do
local data
data, __buffer = recv_package(__buffer)
if not data then
break
end
-- , , , quick 。
local packet = protobuf.decode("Packet", data)
local cmd = packet.cmd
local session = packet.session
local body = packet.body
local event = {eventType = cmd, data = body, userdata = self._sessions[session]}
__netDispatcher:dispatchEvent(event)
end
-- trace("after __buffer:" .. #__buffer)
end
간단하게 말 하면 quick 의 socketTCP 와 같은 종 류 는 socket 안의 데 이 터 를 정기 적 으로 읽 습 니 다. 이 과정 은 onData 에서 발생 합 니 다. 데이터 가 변화 할 때마다 읽 지 못 한 데 이 터 를 전역 변수 로 캐 시 한 다음 에 정 의 된 구조, 일반 길이 에 데 이 터 를 추가 하여 데 이 터 를 읽 습 니 다.이 곳 의 buffer 가 하나의 가방 이 어야 한 번 의 사건 을 던 지고 이 가방 의 정 보 를 가 져 올 수 있 습 니 다. 또는 여기 의 buffer 가 한꺼번에 여러 개의 가방 이 사건 을 옮 겨 다 니 며 데이터 의 완전 성 을 확보 합 니 다. buffer 가 한 가방 을 만족 시 키 지 못 하거나 두 개 + 반 가방 을 가 져 올 때 해당 하 는 결 과 는 두 개의 사건 을 버 리 지 않 고 나머지 가방 을 남 겨 두 어야 합 니 다. 다음 에 데 이 터 를 긁 을 때 까지.가방 을 다 고 쳐 야 다시 던 질 수 있다.그리고 여기 서 왜 lua 의 변수 로 바 이 너 리 데 이 터 를 직접 처리 할 수 있 습 니까?이 유 는 Lua 가 8 비트 에 우호 적 이기 때 문 입 니 다. 문자열 은 0 ('\ 0) 을 포함 하여 임의의 8 비트 값 을 수용 할 수 있 습 니 다.
개발 과정 에 따라 본 고 를 점차적으로 보완 하고 자 합 니 다. 여기 서 소스 코드 를 넣 지 않 겠 습 니 다. 자신의 사 고 를 통 해 이런 문 제 를 이해 할 수 있 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.