클 라 이언 트 와 백 엔 드 의 상호작용 에 남 겨 진 문제

오 랜 만 에 시간 을 내 서 쓰기 시작 했다.1. socket 접착 문제 에 대한 접착 개념 은 이 인형 의 글 을 볼 수 있어 서 매우 뚜렷 하 다.http://blog.csdn.net/binghuazh/article/details/4222516
저희 가 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 비트 값 을 수용 할 수 있 습 니 다.
개발 과정 에 따라 본 고 를 점차적으로 보완 하고 자 합 니 다. 여기 서 소스 코드 를 넣 지 않 겠 습 니 다. 자신의 사 고 를 통 해 이런 문 제 를 이해 할 수 있 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기