ãã 4 ãæéãç§ã¯ããããã¯ãã§ãŒã³ã«åºã¥ãæ¿åºããã³ç£æ¥éšéã«ãããããŒã¿ä¿è·ããã³ç®¡çããŒã«ã®éçºããšãããããžã§ã¯ãã«åãçµãã§ããŸãã
ããã§ç§ããã®ãããžã§ã¯ããå§ããçµç·¯ãã話ããããšæããŸãã次ã«ãããã°ã©ã ã³ãŒãã«ã€ããŠè©³ãã説æããŸãã
ããã¯äžé£ã®èšäºã®æåã®èšäºã§ããããã§ã¯ãµãŒããŒãšãããã³ã«ã«ã€ããŠèª¬æããŸããå®éãèªè
ã¯ãããã®ãããã¯ãã§ãŒã³èŠçŽ ã®ç¬èªã®ããŒãžã§ã³ãäœæããããšãã§ããŸãã
æšå¹Žã®ããžã¿ã«ã»ãã¬ãŒã¯ã¹ã«ãŒã»ããã«ãœã³ã§ã¯ãåæ£å°åž³æè¡ã䜿ã£ãŠç£æ¥ãããžã¿ã«çµæžã«åœ¹ç«ã€ã·ã¹ãã ãäœããšããã¢ã€ãã¢ãåºããããã®éçºã«å¯ŸããŠã€ãããŒã·ã§ã³æ¯æŽåºéãããå©æéã亀ä»ãããŸããïŒå¥éæžããããšæããŸãïŒå©æéã«é¢ããèšäºãã¹ã¿ãŒãã¢ãããå§ããã°ããã®äººåãïŒãçŸåšé çªã«æ²èŒãããŠããŸãã
éçºã¯ Go èšèªã§è¡ããããããã¯ãä¿åãããããŒã¿ããŒã¹ã¯ LevelDB ã§ãã
äž»èŠãªéšåã¯ãããã³ã«ãšãµãŒã㌠(TCP ãš WebSocket ãå®è¡ããŸããæåã®éšåã¯ãããã¯ãã§ãŒã³ã®åæçšã§ã2 çªç®ã®éšåã¯ã¯ã©ã€ã¢ã³ãã®æ¥ç¶ãJavaScript ããã®ãã©ã³ã¶ã¯ã·ã§ã³ãšã³ãã³ãã®éä¿¡çšã§ãã
åè¿°ããããã«ããã®ãããã¯ãã§ãŒã³ã¯äž»ã«ããµãã©ã€ã€ãŒãšé¡§å®¢ã®éããŸãã¯ãã®äž¡æ¹ã®éã®è£œåã®äº€æã 1 人ã§èªååããã³ä¿è·ããããã«å¿ èŠã§ãããããã®äººã ã¯ãäºããä¿¡é Œããããšãæ¥ãã§ããŸããããããããã®ä»äºã¯ãèšç®æ©ãçµã¿èŸŒãŸãããå°åæåž³ããäœæããã ãã§ã¯ãªãã補åã®ã©ã€ããµã€ã¯ã«ãæ±ãéã«çºçããæ¥åžžæ¥åã®ã»ãšãã©ãèªååããã·ã¹ãã ãäœæããããšã§ãããã®åé¡ãæ åœãããã€ãã³ãŒãã¯ããããã¯ãã§ãŒã³ã®æ £äŸã®ããã«ããã©ã³ã¶ã¯ã·ã§ã³ã®å ¥åãšåºåã«ä¿åãããŸã (ãã©ã³ã¶ã¯ã·ã§ã³èªäœã¯ãããã¯ã«ä¿åãããLevelDB ã®ãããã¯ã¯ GOB 圢åŒã§äºåã«ãšã³ã³ãŒããããŸã)ããŸãããããã³ã«ãšãµãŒã㌠(å¥åããŒã) ã«ã€ããŠèª¬æããŸãã
ãã®ãããã³ã«ã¯è€éã§ã¯ãããŸããããã®èŠç¹ã¯ãç¹å¥ãªã³ãã³ã ã©ã€ã³ã«å¿çããŠãäžéšã®ããŒã¿ (éåžžã¯ãããã¯ãŸãã¯ãã©ã³ã¶ã¯ã·ã§ã³) ãããŒãããã¢ãŒãã«åãæ¿ããããšã§ãããŸããããŒãã誰ãèªèããŠããã®ããèªèã§ããããã«ãã€ã³ãã³ããªã亀æããããã«ãå¿ èŠã§ããã«æ¥ç¶ãããŠãããã©ã®ããã«ããžãã¹ãè¡ã£ãŠããã (åæã»ãã·ã§ã³ã®ããã«æ¥ç¶ãããŠããããŒãã¯ãIP ãæ¢ç¥ã§ãããç¶æ ããŒã¿ãã¡ã¢ãªã«ä¿åãããŠããããããé£æ¥ããšãåŒã°ããŸã)ã
Go ããã°ã©ãã®ç解ã§ã¯ããã©ã«ã㌠(Linux ã§ã¯ãã£ã¬ã¯ããªãšåŒã°ããŸã) ã¯ããã±ãŒãžãšåŒã°ããŸãããã®ããããã®ãã£ã¬ã¯ããªããã® Go ã³ãŒããå«ãåãã¡ã€ã«ã®å é ã«ãããã±ãŒãž ãã©ã«ããŒå_ãã®ãã¡ã€ã«ãé 眮ãããŠããå Žæ ãšæžããŸããããããªããšãããã±ãŒãžãã³ã³ãã€ã©ãŒã«ãã£ãŒãã§ããªããªããŸãããŸããããã¯ãã®èšèªãç¥ã£ãŠãã人ã«ãšã£ãŠã¯ç§å¯ã§ã¯ãããŸãããããã±ãŒãžã¯æ¬¡ã®ãšããã§ãã
- ãããã¯ãŒã¯éä¿¡ïŒãµãŒããŒãã¯ã©ã€ã¢ã³ãããããã³ã«ïŒ
- ä¿åããã³éä¿¡ãããããŒã¿ã®æ§é (ãããã¯ããã©ã³ã¶ã¯ã·ã§ã³)
- ããŒã¿ããŒã¹ïŒãããã¯ãã§ãŒã³ïŒ
- ã³ã³ã»ã³ãµã¹
- ã¹ã¿ãã¯ä»®æ³ãã·ã³ (xvm)
- è£å© (æå·ãã¿ã€ã) ä»ã®ãšããã¯ããã§ãã¹ãŠã§ãã
ããã¯æè²çšããŒãžã§ã³ã§ãããããã»ã¹éã®çžäºäœçšãããã€ãã®å®éšçãªã³ã³ããŒãã³ããæ¬ ããŠããŸãããæ§é ã¯éçºãå®è¡ãããŠãããã®ã«å¯Ÿå¿ããŠããŸããã³ã¡ã³ãã§ãææ¡ãããã°ãä»åŸã®éçºã«åãã§èæ ®ãããŠããã ããŸããããŠããµãŒããŒã®èª¬æãš .
ãŸããµãŒããŒãèŠãŠã¿ãŸãããã
ãµãŒã㌠ãµãã«ãŒãã³ã¯ããããã³ã« ããã±ãŒãžã®ããŒã¿æ§é ã䜿çšã㊠TCP ãããã³ã«äžã§å®è¡ãããããŒã¿ ãµãŒããŒãšããŠæ©èœããŸãã
ãã®ã«ãŒãã³ã¯æ¬¡ã®ããã±ãŒãžã䜿çšããŸãã , , ãããã±ãŒãžèªäœã« tcp_server.go ããŒã¿æ§é ãå«ãŸããŠããŸã ãµãŒã.
type Serve struct {
Port string
BufSize int
ST *types.Settings
}
次ã®ãã©ã¡ãŒã¿ãåãå ¥ããããšãã§ããŸãã
- ããŒã¿äº€æã«äœ¿çšããããããã¯ãŒã¯ ããŒã
- JSON圢åŒã®ãµãŒããŒèšå®ãã¡ã€ã«
- ãããã°ã¢ãŒãã§å®è¡ããããã®ãã©ã° (ãã©ã€ããŒããããã¯ãã§ãŒã³)
é²æïŒ
- JSONãã¡ã€ã«ããèšå®ãèªã¿åããŸã
- ãããã° ã¢ãŒã ãã©ã°ããã§ãã¯ãããŸãããããèšå®ãããŠããå Žåããããã¯ãŒã¯åæã¹ã±ãžã¥ãŒã©ã¯èµ·åãããããããã¯ãã§ãŒã³ã¯ããŒããããŸããã
- æ§æããŒã¿æ§é ã®åæåãšãµãŒããŒã®èµ·å
ãµãŒããŒ
- TCP ãµãŒããŒã®èµ·åãšãããã³ã«ã«åŸã£ãŠãããã¯ãŒã¯å¯Ÿè©±ãå®è¡ããŸãã
- ããã«ã¯ãããŒãçªå·ããããã¡ãŒ ãµã€ãºãããã³æ§é äœãžã®ãã€ã³ã¿ãŒã§æ§æããã Serve ããŒã¿æ§é äœããããŸãã ã¿ã€ã.èšå®
- Run ã¡ãœããã¯ãããã¯ãŒã¯ ã€ã³ã¿ã©ã¯ã·ã§ã³ãéå§ããŸã (ç¹å®ã®ããŒãã§åä¿¡æ¥ç¶ããªãã¹ã³ããæ°ããæ¥ç¶ãåä¿¡ãããšããã®åŠçãæ°ããã¹ã¬ããã®ãã©ã€ããŒã ãã³ãã« ã¡ãœããã«è»¢éãããŸã)ã
- Ð ãã³ãã« æ¥ç¶ããã®ããŒã¿ã¯ãããã¡ã«èªã¿èŸŒãŸããæååè¡šçŸã«å€æãããŠã ãããã³ã«ã®éžæ
- ãããã³ã«ã®éžæ æ»ã çµæ ãŸãã¯ãšã©ãŒãçºçããŸãã çµæ ãã®åŸã«è»¢éãããŸãã ãããã³ã«ã®è§£éè¿ããã® å éš - ã¿ã€ãã®ãªããžã§ã¯ã ããŒã¿ã®è§£éããŸãã¯éžæçµæã®åŠçäžã«ãšã©ãŒãçºçãã
- ãã®åŸãã¹ã€ãããå®è¡ãããŸã intrpr.ã³ãã³ã[0] 次ã®ããããããã§ãã¯ããŸãã çµæãå転ããšã©ãŒ ãããŠã»ã¯ã·ã§ã³ããããŸã ããã©ã«ã
- ã»ã¯ã·ã§ã³ã§ çµæ ã¹ã€ããã¯å€ã«ãã£ãŠæ€åºãããŸã intrpr.ã³ãã³ã[1] å€ããã§ãã¯ããŸã ãããã¡é· О ããŒãžã§ã³ (ããããã®å Žåã«ãããŠã察å¿ããé¢æ°ãåŒã³åºãããŸã)
æ©èœ ããŒãžã§ã³ã®ååŸ Ðž ãããã¡é· ãã¡ã€ã«ã®äžã«ãããŸã srvlib.go ãµãŒããŒããã±ãŒãž
GetVersion(conn net.Conn, version string)
åçŽã«ã³ã³ãœãŒã«ã«åºåãããã©ã¡ãŒã¿ã§æž¡ãããããŒãžã§ã³ãã¯ã©ã€ã¢ã³ãã«éä¿¡ããŸãã
conn.Write([]byte("result:" + version))
.
æ©èœ
BufferLength(conn net.Conn, intrpr *protocol.InterpreteData)
次ã®ããã«ããããã¯ããã©ã³ã¶ã¯ã·ã§ã³ããŸãã¯ãã®ä»ã®ç¹å®ã®ããŒã¿ãããŒãããŸãã
- åãå
¥ããå¿
èŠããããããã³ã«ã§æå®ãããããŒã¿ã®ã¿ã€ããã³ã³ãœãŒã«ã«åºåããŸãã
fmt.Println("DataType:", intrpr.Commands[2])
- å€ãèªã¿åããŸã intrpr.Body æ°å€å€æ°ã« buf_len
- ãããã¡ãäœæããŸã æ°ãããã æå®ããããµã€ãº:
make([]byte, buf_len)
- OK å¿çãéä¿¡ããŸãã
conn.Write([]byte("result:ok"))
- èªã¿åãã¹ããªãŒã ãããããã¡ãŒãå®å
šã«åããŸãã
io.ReadFull(conn, newbuf)
.
- ãããã¡ã®å
容ãã³ã³ãœãŒã«ã«åºåããŸãã
fmt.Println(string(newbuf))
ãšèªã¿åããããã€ãæ°
fmt.Println("Bytes length:", n)
- OK å¿çãéä¿¡ããŸãã
conn.Write([]byte("result:ok"))
ãµãŒã㌠ããã±ãŒãžã®ã¡ãœããã¯ãããã±ãŒãžã®é¢æ°ã䜿çšããŠåä¿¡ããŒã¿ãåŠçããããã«æ§æãããŠããŸã .
ãããã³ãŒã«
ãããã³ã«ã¯ããããã¯ãŒã¯äº€æã«ãããŠããŒã¿ãè¡šãæ段ãšããŠæ©èœããŸãã
Choice(str string) (æååããšã©ãŒ) ãµãŒããŒãåä¿¡ããããŒã¿ã®äžæ¬¡åŠçãå®è¡ããããŒã¿ã®æååè¡šçŸãå ¥åãšããŠåãåããæºåãããæååãè¿ããŸãã éèš³:
- å ¥åæååã¯ã次ã®ããã«ããããšããã£ã«åå²ãããŸãã ReqParseN2(str)
- head ã¯èŠçŽ ã«åå²ãããReqParseHead(head) ã䜿çšããŠã³ãã³ã ã¹ã©ã€ã¹ã«é 眮ãããŸãã
- Ð ã¹ã€ãã(ã³ãã³ã[0]) åä¿¡ããã³ãã³ããéžæ (cmdãããŒãã¢ãã¬ã¹ ãŸãã¯ã»ã¯ã·ã§ã³ãããªã¬ãŒããã ããã©ã«ã)
- cmdã§2ã€ã®ã³ãã³ãããã§ãã¯ãããŠããŸã switch(commands[1]) â é·ã О ããŒãžã§ã³ãååŸ.
- é·ã ããŒã¿åããã§ãã¯ããŸã ã³ãã³ã[2] ãããŠãããä¿åããŸã ããŒã¿ã»ã¿ã€ã
- ããããã§ãã¯ããŸã ãã㣠æååå€ãå«ãŸããŠããŸã
len(body) < 1
- å¿çæååãè¿ããŸãã
"result:bufferlength:" + datatype + "/" + body
- ããŒãžã§ã³ãååŸ æååãè¿ããŸã
return "result:version/auto"
éèš³
InterpreteData æ§é äœãå«ãŸããŠãããããè¿ãããããŒã¿ã®äºæ¬¡åŠçãå®è¡ããŸãã éžæ æååãšãªããžã§ã¯ãã®åœ¢æ ããŒã¿ã®è§£é.
type InterpreteData struct {
Head string
Commands []string
Body string
IsErr bool
ErrCode int
ErrMessage string
}
æ©èœ
Interprete(str string) (*InterpreteData, error)
æååãåãå ¥ããŸã çµæ ãªããžã§ã¯ããžã®åç §ãäœæããŠè¿ããŸã ããŒã¿ã®è§£é.
é²æïŒ
- åæ§ã« éžæ é ãšèŽäœã¯æ¬¡ã䜿çšããŠæœåºãããŸã ReqParseN2(str)
- head ã¯æ¬¡ã䜿çšããŠèŠçŽ ã«åå²ãããŸã ReqParseHead(ããã)
- ãªããžã§ã¯ããåæåãããŸã ããŒã¿ã®è§£é ãããŠãããžã®ãã€ã³ã¿ãè¿ãããŸãã
res := &InterpreteData{
Head: head,
Commands: commands,
Body: body,
}
return res, nil
ãã®ãªããžã§ã¯ãã¯ä»¥äžã§äœ¿çšãããŸã ãµãŒããŒ.ãŽãŒ ããã±ãŒãžã¡ã€ã³ã
ã¯ã©ã€ã¢ã³ã
ã¯ã©ã€ã¢ã³ãããã±ãŒãžã«ã¯æ¬¡ã®æ©èœãå«ãŸããŠããŸã TCPæ¥ç¶ О TCPå¿çããŒã¿.
æ©èœ
TCPConnect(s *types.Settings, data []byte, payload []byte)
ãã®ããã«åäœããŸãïŒ
- æž¡ãããèšå®ãªããžã§ã¯ãã§æå®ãããæ¥ç¶ãžã®æ¥ç¶ã確ç«ãããŸãã
net.Dial("tcp", s.Host + ":" + s.Port)
- data ãã©ã¡ãŒã¿ã§æž¡ãããããŒã¿ãéä¿¡ãããŸãã
conn.Write(data)
- çããèªãŸããŸã
resp, n, _ := TCPResponseData(conn, s.BufSize)
ãããŠã³ã³ãœãŒã«ã«å°å·ãããŸãã
fmt.Println(string(resp[:n]))
- è²æž¡ãããå Žå ãã€ããŒã ãããããããæž¡ããŸã
conn.Write(payload)
ãŸãããµãŒããŒã®å¿çãèªã¿åããã³ã³ãœãŒã«ã«åºåããŸãã
æ©èœ
TCPResponseData(conn net.Conn, bufsiz int) ([]byte, int, error)
æå®ããããµã€ãºã®ãããã¡ãäœæãããããããµãŒããŒå¿çãèªã¿åãããã®ãããã¡ãšèªã¿åã£ããã€ãæ°ãããã³ãšã©ãŒ ãªããžã§ã¯ããè¿ããŸãã
ã¯ã©ã€ã¢ã³ããµãã«ãŒãã³
ããŒããµãŒããŒã«ã³ãã³ããéä¿¡ããããç°¡åãªçµ±èšããã¹ããååŸããããã圹å²ãæãããŸãã
次ã®ãã©ã¡ãŒã¿ãåãå ¥ããããšãã§ããŸã: JSON 圢åŒã®èšå®ãã¡ã€ã«ãæååãšããŠãµãŒããŒã«éä¿¡ãããããŒã¿ããã€ããŒãã«éä¿¡ããããã¡ã€ã«ãžã®ãã¹ãããŒã ã¹ã±ãžã¥ãŒã© ãšãã¥ã¬ãŒã·ã§ã³ ãã©ã°ãæ°å€ãšããŠè»¢éãããããŒã¿ã®çš®é¡ã
- æ§æã®ååŸ
st := types.ParseConfig(*config)
- ãšãã¥ãã©ã°ãæž¡ããšèµ·å ã·ã§ãã¥ãŒã©ãŒ
- ãã¡ã€ã«ãžã®ãã¹ã瀺ã f ãã©ã°ãæå®ãããŠããå Žåã¯ããã®ããŒã¿ã FDB ãããŠã³ã³ãã³ãããµãŒããŒã«éä¿¡ãããŸã
client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
- ãã¡ã€ã«ãæå®ãããŠããªãå Žåã¯ããã©ã°ã®ããŒã¿ãåã«éä¿¡ãããŸãã -d:
client.TCPConnect(st, []byte(*data), nil)
ããã¯ãã¹ãŠããããã³ã«ã®æ§é ã瀺ãç°¡ç¥åãããè¡šçŸã§ããéçºäžã«ãå¿ èŠãªæ©èœããã®æ§é ã«è¿œå ãããŸãã
第 3 éšã§ã¯ããããã¯ãšãã©ã³ã¶ã¯ã·ã§ã³ã®ããŒã¿æ§é ã«ã€ããŠèª¬æããŸãã第 4 éšã§ã¯ãJavaScript ããæ¥ç¶ããããã® WebSocket ãµãŒããŒã«ã€ããŠèª¬æããŸãã第 XNUMX éšã§ã¯ãåæã¹ã±ãžã¥ãŒã©ã次ã«å
¥åºåããã®ãã€ãã³ãŒããæå·åãããã³æå·åãåŠçããã¹ã¿ã㯠ãã·ã³ã«ã€ããŠèª¬æããŸããåºåçšã®ããŒã«ã
åºæïŒ habr.com