GateServer 게이트웨이
7059 단어 skynet
TCP는 데이터 흐름을 바탕으로 하지만 일반적으로 우리는 길이의 정보를 가진 데이터 패키지의 구조로 데이터 교환을 해야 한다.gateserver가 하는 일은 바로 이 작업이다. 데이터 흐름을 패키지로 자르는 걱정거리를 처리할 수 있는 주소로 전달하는 것이다
활용단어참조
ocal gateserver = require "snax.gateserver"
local handler = {}
-- register handlers here
gateserver.start(handler)
이렇게 하면 하나의 인터페이스 서비스를 시작할 수 있다.handler는 사용자 정의 메시지 처리 함수이다. 각각 다음과 같다.
function handler.connect(fd, ipaddr)
새로운 연결이 설정된 후,connect 방법이 호출되고, 연결된 socket fd와 새로운 연결된 IP 주소가 전송됩니다. (일반적으로log 출력에 사용됩니다.)function handler.disconnect(fd)
연결이 끊어지면 disconnect가 호출되고 fd는 어느 연결인지 표시합니다.function handler.error(fd, msg)
연결이 이상하면 error가 호출됩니다. fd를 제외하고는 오류 정보 msg를 받을 수 있습니다.
function handler.command(cmd, source, ...)
만약에 서비스가 skynet 내부 메시지를 처리하기를 원한다면command 방법을 등록하고 Lua 프로토콜의 skynet 메시지를 받으면 이 방법을 호출할 수 있습니다. cmd는 메시지의 첫 번째 값입니다. 보통 문자열로 약정되어 어떤 명령인지,source는 메시지의 출처 주소입니다.이 방법의 반환값은 skynet을 통과합니다.ret/skynet.oack은 원본 서비스로 돌아갑니다.오픈과close 두 명령은 보류되어 있습니다.gate에서 감청 포트를 열고 감청 포트를 닫는 데 사용됩니다.
function handler.open(source, conf)
만약 당신이 감청 포트가 열릴 때 초기화 작업을 원한다면open이라는 방법을 제공할 수 있습니다.source는 요청 출처 주소이고,conf는gate를 여는 매개 변수표입니다.function handler.message(fd, msg, sz)
온전한 가방이 나누어진 후에 메시지 방법이 호출됩니다. 여기 msg는 C 바늘이고 sz는 숫자입니다. 가방의 길이(C 바늘이 가리키는 메모리 블록의 길이)를 표시합니다. 주의: 이 C 바늘은 처리가 끝난 후에 C 방법 skynet_석방하다.(일반적으로 봉인된 라이브러리netpack.tostring으로 이 밑바닥의 데이터 처리를 하는 것을 권장합니다.)아니면 스카이넷을 통해.redirect는 다른 skynet 서비스 처리에 전달됩니다.
function handler.warning(fd, size)
fd에서 보낼 데이터가 1M 바이트를 초과하면 이 방법을 리셋합니다. 이 메시지를 무시할 수도 있습니다.
이러한 방법에서gateserver 모듈을 호출할 수 있는 방법은 다음과 같다.
gateserver.openclient(fd) -- fd
매번 핸들러를 받습니다.connect 후, fd에 있는 메시지를 Openclient로 불러와야 합니다.기본 상태에서, fd는 서버에 연결되어 있을 뿐, 메시지를 보낼 수 없습니다. 이 절차는 당신이 표시한 호출이 필요할 때, 새로운 연결이 만들어진 후에 fd의 제어권을 다른 서비스에 넘겨야 하기 때문에, 모든 준비가 다 된 후에 메시지를 안심할 수 있습니다.gateserver.closeclient(fd) -- fd
보통 연결을 자발적으로 걷어차는 데 쓰인다.wire protocol
이곳은 가능한 한 좌석의 가장 간단한 약속이다
가방마다 2바이트+데이터 내용이 있습니다. 이 두 바이트는big-endian 인코딩된 숫자로 데이터 내용은 임의의 바이트일 수 있습니다.
따라서 단일 패킷은 최대 65535바이트를 초과할 수 없습니다. 만약에 업무층이 더 큰 데이터 블록을 전송해야 한다면 상부 업무 협의에서 해결하십시오.
netpack api
lualib-src/lua-netpack.c는 이런 데이터 패키지를 처리하는 라이브러리이다
local netpack = require "netpack"
이 라이브러리를 불러올 수 있습니다.netpack.pack (msg.[sz]) 는 문자열 (또는 C 바늘에 길이를 더한) 을 2 바이트 헤더가 있는 데이터 블록으로 포장합니다. 이api는lightuserdata와number를 되돌려줍니다.너는 직접 소켓으로 배달할 수 있다.write 발송 (socket.write는 최종적으로 메모리를 방출하는 것을 책임진다).
netpack.tostring(msg,sz)handler.메시지 방법으로 받은 msg.sz를 루아string으로 변환하고 msg가 차지하는 C 메모리를 방출합니다.
netpack은gateserver의 실현에 사용되는 내부api도 있습니다.
Gate 서버
service/gate.루아는 완전한 스위치 서버를 실현하는 동시에 snax로도 사용할 수 있다.gateserver의 사용 범례.examples/watchdog.루아는 서비스/gate를 시작하는 참고할 수 있는 예입니다.lua 서비스, 외부 연결을 처리하는 메시지를 전송합니다.
gate 서비스가 시작되면 즉시 감청을 시작하는 것이 아닙니다. gate 서버에 감청 포트를 열려면 루아 프로토콜을 통해 오픈 명령을 보내고 시작 매개 변수표를 첨부합니다. 다음은 시범입니다.
skynet.call(gate, "lua", "open", {
address = "127.0.0.1", -- 127.0.0.1
port = 8888, -- 8888
maxclient = 1024, -- 1024
nodelay = true, -- TCP_NODELAY
})
주: 이 템플릿은 Socket 라이브러리와 함께 사용할 수 없습니다. 이 템플릿은 socket 클래스의 메시지를 연결했기 때문입니다.
기타 방안
skynet은 게이트웨이를 어떻게 작성하는지 제한하지 않습니다. 예를 들어 이 모듈을 사용할 수 있습니다.http://blog.codingnow.com/2016/03/skynet_tcp_package.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Config 구성이 프로필은 skynet을 통해 사용할 수 있습니다.getenv 가져오기. 보통 서비스/bootstrap을 가리킵니다.루아 이 코드. 이 경로는 여러 가지를 설정할 수 있습니다.분할하다 만약logger가 nil로 설...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.