Mo le fa masina i le taimi nei sa ou galue i se poloketi ua taʻua o le "Atiae o le puipuiga o faʻamatalaga ma meafaigaluega tau pulega i totonu o le malo ma vaega tau alamanuia e faʻavae i luga o poloka poloka."
O lenei ou te fia taʻu atu ia te oe le auala na ou amataina ai lenei poloketi, ma o lenei o le a ou faʻamatalaina auiliili le code program.
O le tala muamua lea i se faasologa o tala. O iinei ou te faamatalaina ai le server ma le protocol. O le mea moni, e mafai e le tagata faitau ona tusia ana lava faʻamatalaga o nei elemene poloka poloka.
I le tausaga na teʻa nei, i le Digital Breakthrough hackathon, na latou maua ai se manatu e faia se faiga aoga mo alamanuia ma le tamaoaiga numera e faʻaaoga ai tekonolosi faʻasalalau tufatufa; na tuʻuina atu foi se fesoasoani mo le atinaʻeina e le Innovation Assistance Fund (E tatau ona ou tusia se isi vaega. tusiga e uiga i le foaʻi, mo i latou o loʻo amata amataina), ma o lea ua faʻatonuina.
O le atina'e e faia i le gagana Go, ma o le database o lo'o teuina ai poloka o le LevelDB.
O vaega autu o le protocol, le server (lea e faʻatautaia TCP ma WebSocket - muamua mo le faʻamaopoopoina o le poloka poloka, lona lua mo le faʻafesoʻotaʻi tagata faʻatau, auina atu fefaʻatauaiga ma poloaiga mai le JavaScript, mo se faʻataʻitaʻiga.
E pei ona taʻua, o lenei poloka poloka e manaʻomia muamua e faʻatautaia ma puipuia le fefaʻatauaʻiga o oloa i le va o tagata faʻatau ma tagata faʻatau, poʻo uma i le tagata e toʻatasi. O nei tagata e le faanatinati e talitonu le tasi i le isi. Ae o le galuega e le gata o le fatuina o se "tusi siaki" ma se calculator ua fausia, ae o se faiga e faʻaaogaina ai le tele o galuega masani e tulaʻi mai pe a galue ma le taamilosaga o le olaga o oloa. O le bytecode e nafa ma lenei mataupu, e pei ona masani ai poloka poloka, o loʻo teuina i totonu o faʻaoga ma gaioiga o fefaʻatauaiga (o fefaʻatauaiga lava ia o loʻo teuina i totonu o poloka, o poloka ile LevelDB o loʻo faʻapipiʻiina i le GOB format). Muamua, tatou talanoa e uiga i le protocol ma le server (aka node).
O le protocole e le faigata, o lona uiga atoa o le fesuiaʻi lea i le faiga o le utaina o nisi faʻamatalaga, e masani lava o se poloka poʻo se fefaʻatauaiga, i le tali atu i se laina faʻapitoa, ma e manaʻomia foi mo le fesuiaiga o suʻesuʻega, ina ia iloa e le node poʻo ai. e fesoʻotaʻi ma pe faʻafefea ona fai a latou pisinisi (o nodes e fesoʻotaʻi mo le sauniga faʻatasi e taʻua foi o le "tuaoi" aua o loʻo iloa a latou IP ma o loʻo teuina a latou faʻamaumauga i le mafaufau).
O faila (directories e pei ona taʻua e Linux) i le malamalama o Go programmers e taʻua o afifi, o lea i le amataga o faila taʻitasi ma le Go code mai lenei lisi latou te tusia ai le pusa folder_name_where_this_file o loʻo i ai. A leai, o le a le mafai ona e fafagaina le afifi i le tagata faʻapipiʻi. Ia, e le o se mea lilo lea mo i latou e iloa lenei gagana. O afifi nei:
- Feso'ota'iga feso'ota'iga (server, client, protocol)
- Fa'atulagaina o fa'amaumauga teuina ma fa'asalalauina (poloka, fefa'atauaiga)
- Fa'amaumauga (polokaina)
- Autasi
- Masini fa'aputuga (xvm)
- Auxiliary (crypto, type) o le mea lena mo le taimi nei.
Ole fa'aa'oa'oga lea, e leai ni feso'ota'iga va'ava'ai ma le tele o vaega fa'ata'ita'i, ae o le fausaga e fetaui ma le mea o lo'o fa'atinoina ai le atina'e. Afai ei ai sau mea e fautua mai i faʻamatalaga, o le a ou fiafia e faʻatatau i le atinaʻe atili. Ma o lenei mo se faʻamatalaga o le server ma maliega.
Se'i o tatou va'ai muamua ile server.
O le subroutine server e galue o se faʻamaumauga faʻamaumauga o loʻo tamoʻe i luga o le TCP protocol e faʻaaoga ai faʻamaumauga mai le pusa faʻamaumauga.
O le masani e faʻaaogaina afifi nei: faigaluega, maliega, ituaiga. I totonu o le afifi lava ia tcp_server.go o lo'o iai fa'amaumauga fa'amaumauga tautua.
type Serve struct {
Port string
BufSize int
ST *types.Settings
}
E mafai ona talia vaega nei:
- Tau feso'ota'iga lea o le a fesuia'i ai fa'amatalaga
- Fa'atonu faila faila ile JSON format
- Fu'a mo le tamo'e i le faiga debug (fa'ato'a poloka poloka)
Alualu i luma:
- Faitau le seti mai le faila JSON
- Ua siaki le fu'a o le debug mode: afai e seti, e le faʻalauiloaina le faʻatulagaina o fesoʻotaʻiga fesoʻotaʻiga ma e le utaina le poloka poloka.
- Amataina le faʻatulagaina o faʻamaumauga faʻamaumauga ma amataina le server
Tagata faigaluega
- Faʻatinoina le faʻalauiloaina o le TCP server ma fesoʻotaʻiga fesoʻotaʻiga e tusa ai ma le protocol.
- O lo'o i ai se fa'asologa o fa'amaumauga o le Serve e aofia ai se numera o le taulaga, se lapo'a pa'u ma se fa'asino ile fausaga ituaiga.Settings
- O le Run method e amata ai fesoʻotaʻiga fesoʻotaʻiga (faʻalogo mo fesoʻotaʻiga o loʻo oʻo mai i luga o se taulaga tuʻufaʻatasia, pe a maua se fesoʻotaʻiga fou, o lona gaioiga e faʻafeiloaʻi atu i le auala tumaoti i se filo fou)
- В lima fa'amatalaga mai le feso'ota'iga e faitau i totonu o se pa'u, liliu i se manoa fa'atusa ma pasi atu i protocol.Filifiliga
- protocol.Filifiliga toe fo'i mai iʻuga pe mafua ai se mea sese. iʻuga ona siitia atu lea i protocol.Fa'amatalalea e toe foi mai intrpr - mea o le ituaiga InterpreteData, pe mafua ai se mea sese i le faagasologa o le filifiliga filifiliga
- Ona fai lea o le ki intrpr.Poloaiga[0] lea e siaki ai se tasi o: i'uga, inv, sese ma o loʻo i ai se vaega Leai se totogi
- I le vaega iʻuga e maua le ki i le tau intrpr.Poloaiga[1] lea e siaki ai tau uumi umi и faʻamatalaga (i tulaga taʻitasi e taʻua le galuega tutusa)
Galuega tauave GetVersion и Pa'u Umi o loʻo i totonu o le faila srvlib.go pusa server
GetVersion(conn net.Conn, version string)
e na'o le lolomi i le fa'amafanafanaga ma tu'u atu le kopi na pasia i le parakalafa i le kalani:
conn.Write([]byte("result:" + version))
.
galuega tauave
BufferLength(conn net.Conn, intrpr *protocol.InterpreteData)
utaina se poloka, fefaʻatauaiga, poʻo isi faʻamatalaga patino e pei ona taua i lalo:
- Lolomi i le fa'amafanafanaga le ituaiga o fa'amaumauga o lo'o fa'amaoti mai i le protocol e mana'omia ona talia:
fmt.Println("DataType:", intrpr.Commands[2])
- Faitau le tau intrpr.Tino i se fesuiaiga numera buf_len
- Fausia se pa'u newbuf lapopoa fa'apitoa:
make([]byte, buf_len)
- Auina atu se tali lelei:
conn.Write([]byte("result:ok"))
- Faatumu atoa le pa'u mai le vaitafe faitau:
io.ReadFull(conn, newbuf)
.
- Lolomi mea o lo'o i totonu o le pa puipui i le fa'amafanafanaga
fmt.Println(string(newbuf))
ma le numera o paita faitau
fmt.Println("Bytes length:", n)
- Auina atu se tali lelei:
conn.Write([]byte("result:ok"))
Metotia mai le pusa server ua faʻatulagaina e faʻagasolo ai faʻamatalaga maua mai e faʻaaoga ai galuega mai le afifi maliega.
Maliega
O se protocol e avea o se auala e faʻaalia ai faʻamatalaga i fesoʻotaʻiga fesoʻotaʻiga.
Filifiliga(str manoa) ( manoa, sese) faia le faagasologa muamua o faʻamatalaga na maua e le 'auʻaunaga, maua se manoa faʻatusa o faʻamaumauga e fai ma faʻaoga ma toe faʻafoʻi mai se manoa ua saunia mo Faʻamatala upu:
- O le manoa fa'aoga e vaevae i le ulu ma le tino e fa'aaoga ai ReqParseN2(str)
- ua vaevaeina le ulu i elemene ma tuʻu i totonu o se fasi faʻatonuga e faʻaaoga ai ReqParseHead(ulu)
- В sui(poloaiga[0]) filifili le poloaiga maua (cmd, ki, tuatusi po'o le vaega ua fa'aosoina Leai se totogi)
- 2 poloaiga e siaki ile cmd sui(poloaiga [1]) — umi и getversion.
- Uumi siaki le ituaiga faʻamatalaga i totonu poloaiga[2] ma teu ai i totonu ituaiga faʻamatalaga
- Siaki lena tino o lo'o i ai se tau manoa
len(body) < 1
- Toe faafoi le manoa tali:
"result:bufferlength:" + datatype + "/" + body
- getversion toe faafoi mai se manoa
return "result:version/auto"
Faʻamatala upu
O lo'o iai le fa'atulagaina o le InterpreteData ma fa'atino lona lua fa'agaioiga o fa'amaumauga na toe fa'afo'i mai filifiliga manoa ma mea faitino InterpreteData.
type InterpreteData struct {
Head string
Commands []string
Body string
IsErr bool
ErrCode int
ErrMessage string
}
galuega tauave
Interprete(str string) (*InterpreteData, error)
talia se manoa iʻuga ma faia ma toe faafoi se faasinomaga i le mea InterpreteData.
Alualu i luma:
- E faapena foi filifiliga o le ulu ma le tino e fa'aaogaina ReqParseN2(str)
- ulu ua vaevaeina i elemene e faʻaaoga ai ReqParseHead(ulu)
- Ua amatalia le mea InterpreteData ma ua toe fo'i mai le fa'asino i ai.
res := &InterpreteData{
Head: head,
Commands: commands,
Body: body,
}
return res, nil
O lenei meafaitino e faʻaaogaina i server.go afifi autu.
tagata faʻatau
O lo'o iai i totonu o le afifi o tagata o tausia galuega TCPConnect и TCPResponseData.
galuega tauave
TCPConnect(s *types.Settings, data []byte, payload []byte)
galue e pei o lenei:
- E faia se feso'ota'iga i le feso'ota'iga o lo'o fa'amaoti mai i le mea fa'atulagaina ua pasia
net.Dial("tcp", s.Host + ":" + s.Port)
- O faʻamatalaga na pasia i le faʻamaufaʻailoga faʻamaumauga e tuʻuina atu:
conn.Write(data)
- Ua faitau le tali
resp, n, _ := TCPResponseData(conn, s.BufSize)
ma lolomi i luga o le console
fmt.Println(string(resp[:n]))
- Afai ua siitia Totogi totogi ona pasi atu lea
conn.Write(payload)
ma faitau foi le tali a le server, lolomi i le console
galuega tauave
TCPResponseData(conn net.Conn, bufsiz int) ([]byte, int, error)
faia se pa'u o le lapopo'a fa'apitoa, faitau le tali a le 'au'aunaga iina ma toe fa'afo'i le pa'u ma le numera o bytes faitau, fa'apea fo'i ma se mea sese.
La'au masani a tagata fa'atau
Auauna e auina atu poloaiga i node servers, faʻapea foʻi ma le mauaina o faʻamaumauga puʻupuʻu ma suʻega.
E mafai ona talia fa'asologa o lo'o i lalo: faila faila i le JSON format, fa'amaumauga e lafo i le server e pei o se manoa, ala i le faila e lafo i le uta, node scheduler emulation fu'a, ituaiga o fa'amatalaga fa'aliliuina o se tau numera.
- Mauaina o le faatulagaga
st := types.ParseConfig(*config)
- Afai e pasia le fu'a emu, e amata tagata fa'atau
- Afai o le f fuʻa e faʻaalia ai le ala i le faila e tuʻuina atu, ona matou utaina lea o ana faʻamatalaga i totonu fdb ma o le anotusi e auina atu i le server
client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
- Afai e le o faʻamaonia le faila, ona tuʻuina atu lea o faʻamatalaga mai le fuʻa -d:
client.TCPConnect(st, []byte(*data), nil)
O nei mea uma o se faʻataʻitaʻiga faigofie e faʻaalia ai le fausaga o le protocol. I le taimi o le atinaʻe, e faʻaopoopoina galuega talafeagai i lona fausaga.
I le vaega lona lua o le a ou talanoa e uiga i faʻamaumauga o faʻamaumauga mo poloka ma fefaʻatauaiga, i le 3 e uiga i le WebSocket server mo le faʻafesoʻotaʻi mai le JavaScript, i le 4 o le a ou vaʻavaʻai i le synchronization scheduler, ona faʻapipiʻi ai lea o se masini faʻapipiʻi e faʻagasolo le bytecode mai mea e faʻaoga ma gaioiga, cryptography ma vaitaele mo galuega faatino.
puna: www.habr.com