项目作者: kasworld

项目描述 :
generate protocol code
高级语言: Go
项目地址: git://github.com/kasworld/genprotocol.git
创建时间: 2019-10-09T02:34:27Z
项目社区:https://github.com/kasworld/genprotocol

开源协议:Apache License 2.0

下载


genprotocol - protocol 기반 코드 생성

( goguelike 프로젝트를 하면서 만들어진 )
네트웍 등에서 사용하기 위한 protocol 을 작성하는데 필요한 반복적 이고 기계적인 코드들을 자동으로 생성 해주는 프로그램 입니다.

example folder 에서 예제를 볼 수 있습니다.

작성 이유는 하나의 프로젝트에서 여러종의 protocol 을 사용할 일이 생겨서
반복된 코드를 작성하다 보니 만들게 되었습니다.

goguelike 를 예로 들면

game client - tower server

tower server - ground server

의 2종의 protocol이 필요하고 사실상 비슷한데 조금 다른 코드들이 서로 구별 되어 쓰입니다.

사용 법

위 와 같은 경우

genprotocol -ver=1.2 -prefix=c2t -basedir=.

genprotocol -ver=1.0 -prefix=t2g -basedir=.

과 같은 형태로 실행합니다.

자동 생성된 파일은 모두 _gen.go 로 끝나는 이름을 가집니다.

인자 설명

ver : protocol의 version ( protocol 마다 버전이 다를 수 있습니다. )

prefix : 각 protocol을 구별하기 위한 prefix

basedir : protocol code가 생성될 기본 폴더, 여기서 prefix_*.enum 을 읽습니다.

example/rundriver 디렉토리

json을 serializer로 사용하는
tcp server/client,
websocket server/client
예제 입니다.

genprotocol에서 읽어 들이는 파일들

  1. 인자로준 basedir 폴더내에서 찾습니다.
  2. 라인의 단어가 enum 이고 space 분리된 부분은 생성된 코드의 comment 된다.
  3. # 으로 시작하는 라인은 무시(comment취급)
  4. prefix_command.enum : request/response packet command id 목록
  5. prefix_noti.enum : notification packet noti id 목록
  6. prefix_error.enum : error code 목록

생성되는 go package (디렉토리)

prefix 는 genprotocol 에 prefix 인자로 준 값

생성이 끝난 코드들은 import code가 제대로 되어 있지 않으니
goimports 등으로 정리 해주어야 합니다.

-verbose 인자를 주고 실행하면 goimports 를 해야할 파일 목록을 찍어 줍니다.

  1. example.sh 실행한 결과
  2. goimports -w example/c2s_version/version_gen.go
  3. goimports -w example/c2s_idcmd/command_gen.go
  4. goimports -w example/c2s_idnoti/noti_gen.go
  5. goimports -w example/c2s_error/error_gen.go
  6. goimports -w example/c2s_const/const_gen.go
  7. goimports -w example/c2s_packet/packet_gen.go
  8. goimports -w example/c2s_obj/objtemplate_gen.go
  9. goimports -w example/c2s_msgp/serialize_gen.go
  10. goimports -w example/c2s_json/serialize_gen.go
  11. goimports -w example/c2s_handlersp/fnobjtemplate_gen.go
  12. goimports -w example/c2s_handlersp/fnbytestemplate_gen.go
  13. goimports -w example/c2s_handlenoti/fnobjtemplate_gen.go
  14. goimports -w example/c2s_handlenoti/fnbytestemplate_gen.go
  15. goimports -w example/c2s_handlereq/fnobjtemplate_gen.go
  16. goimports -w example/c2s_handlereq/fnbytestemplate_gen.go
  17. goimports -w example/c2s_serveconnbyte/serveconnbyte_gen.go
  18. goimports -w example/c2s_connbytemanager/connbytemanager_gen.go
  19. goimports -w example/c2s_conntcp/conntcp_gen.go
  20. goimports -w example/c2s_connwasm/connwasm_gen.go
  21. goimports -w example/c2s_connwsgorilla/connwsgorilla_gen.go
  22. goimports -w example/c2s_loopwsgorilla/loopwsgorilla_gen.go
  23. goimports -w example/c2s_looptcp/looptcp_gen.go
  24. goimports -w example/c2s_pid2rspfn/pid2rspfn_gen.go
  25. goimports -w example/c2s_statnoti/statnoti_gen.go
  26. goimports -w example/c2s_statcallapi/statcallapi_gen.go
  27. goimports -w example/c2s_statserveapi/statserveapi_gen.go
  28. goimports -w example/c2s_statapierror/statapierror_gen.go
  29. goimports -w example/c2s_authorize/authorize_gen.go
  30. 인자로 -statstype=elementtype 주어진 경우 추가로 생성
  31. goimports -w example/c2s_error_stats/c2s_error_stats_gen.go
  32. goimports -w example/c2s_idcmd_stats/c2s_idcmd_stats_gen.go
  33. goimports -w example/c2s_idnoti_stats/c2s_idnoti_stats_gen.go

prefix_obj : protocol struct 들 (packet body)

  1. 생성하는 파일
  2. objtemplate_gen.go : 예제 파일 - 참고해서 "_gen" 없는 파일을 만들것

prefix_handlereq : commandid -> api function map, 과 예제 api function들

  1. 생성하는 파일
  2. fnbytestemplate_gen : packetbody []byte 형태로 api demux, unmarshal api 쪽에서 해야
  3. fntemplate_gen : packetbody interface{} 형태로 api demux, unmarshal 후에 demux map 호출 해야 함.

prefix_version : protocol version 정보

  1. 생성하는 파일
  2. version_gen.go

prefix_error : protocol error code list, errorcode type은 error를 구현하고 있다.

  1. 생성하는 파일
  2. error_gen.go

prefix_idcmd : protocol command (request,response) list

  1. 생성하는 파일
  2. command_gen.go

prefix_idnoti : protocol notification list

  1. 생성하는 파일
  2. noti_gen.go

prefix_const : 각종 상수들 , 설정의 변경이 가능하도록 모아둠.

  1. 생성하는 파일
  2. const_gen.go : 복사해서 _gen 없는 파일을 만들고 comment 풀어 사용할것.

prefix_packet : protocol packet( header + body )

  1. 생성하는 파일
  2. packet_gen.go

prefix_msgp : messagepack marshal/unmarshal code (https://github.com/tinylib/msgp)

  1. 생성하는 파일
  2. serialize_gen.go

prefix_json : json marshal/unmarshal code

  1. 생성하는 파일
  2. serialize_gen.go

prefix_gob : gob marshal/unmarshal code

  1. 생성하는 파일
  2. serialize_gen.go

prefix_loopwsgorilla : go server/client용 gorilla websocket Send/Recv loop (gorilla)

  1. 생성하는 파일
  2. loopwsgorilla_gen.go

prefix_looptcp : go server/client용 TCP Send/Recv loop

  1. 생성하는 파일
  2. looptcp_gen.go

prefix_serveconnbyte : server 용 connection api 처리 (tcp, websocket) packet body []byte 형태

  1. 생성하는 파일
  2. serveconnbyte_gen.go

prefix_connbytemanager : server 용 connection manager, server에 연결된 connection(prefix_serveconnbyte) 을 관리한다.

  1. 생성하는 파일
  2. connbytemanager_gen.go

prefix_connwasm : websocket wasm client 용 connection

  1. 생성하는 파일
  2. connwasm_gen.go

prefix_connwsgorilla : gorilla websocket client 용 connection

  1. 생성하는 파일
  2. connwsgorilla_gen.go

prefix_conntcp : tcp client 용 connection

  1. 생성하는 파일
  2. conntcp_gen.go

prefix_handlersp : response 를 받아서 처리

  1. 생성하는 파일
  2. recvrspobjfnmap_gen.go : 받은 response 처리

prefix_handlenoti : notification을 받아서 처리

  1. 생성하는 파일
  2. recvnotiobjfnmap_gen.go : 받은 notification 처리

prefix_pid2rspfn : callback 형태로 request/response를 처리하기위한 lib(client example참조)

  1. 생성하는 파일
  2. pid2rspfn_gen.go

prefix_statnoti : notification protocol 통계

  1. 생성하는 파일
  2. statnoti_gen.go

prefix_statcallapi : client api call 통계

  1. 생성하는 파일
  2. statcallapi_gen.go

prefix_statserveapi : server api 처리 통계

  1. 생성하는 파일
  2. statserveapi_gen.go

prefix_statapierror : api 결과 error 통계

  1. 생성하는 파일
  2. statapierror_gen.go

prefix_authorize : client api call의 권한 관리 (commandid 기준)

  1. 생성하는 파일
  2. authorize_gen.go

인자로 -statstype=elementtype 이 주어진 경우 추가로 생성하는 패키지

prefix_error_stats : elementtype을 구성요소로한 simple errorcode 통계 (genenum에서 가져옴)

  1. 생성하는 파일
  2. prefix_error_stats_gen.go

prefix_idcmd_stats : elementtype을 구성요소로한 simple commandid 통계 (genenum에서 가져옴)

  1. 생성하는 파일
  2. prefix_idcmd_stats_gen.go

prefix_idnoti_stats : elementtype을 구성요소로한 simple notiid 통계 (genenum에서 가져옴)

  1. 생성하는 파일
  2. prefix_idnoti_stats_gen.go

websocket 을 사용하려면

  1. go get github.com/gorilla/websocket