Te whanaketanga Poraka mo te ahumahi ma te whakamahi i te Haere. Wāhanga 1

Mo nga marama e wha inaianei e mahi ana ahau i tetahi kaupapa e kiia nei ko "Te Whakawhanaketanga o te whakamarumaru raraunga me nga taputapu whakahaere i roto i nga waahanga kawanatanga me nga umanga i runga i te poraka."
Inaianei kei te hiahia ahau ki te korero ki a koe mo te pehea i timata ai ahau i tenei kaupapa, a inaianei ka whakaahuahia e au te waehere kaupapa.

Te whanaketanga Poraka mo te ahumahi ma te whakamahi i te Haere. Wāhanga 1

Koinei te tuhinga tuatahi i roto i te raupapa tuhinga. I konei ka whakaahua ahau i te tūmau me te kawa. Inaa, ka taea e te kaipanui te tuhi i ana ake putanga o enei waahanga poraka.

A koinei te waahanga tuarua — mo te poraka me nga hanganga raraunga tauwhitinga, tae atu ki te paanui e whakatinana ana i te taunekeneke me te papaarangi.

I tera tau, i te hackathon Digital Breakthrough, i puta he whakaaro ki te hanga i tetahi punaha whai hua mo te ahumahi me te ohanga matihiko ma te whakamahi i nga hangarau pukapuka pukapuka tohatoha; i tukuna ano he putea mo te whanaketanga e te Putea Awhina Innovation (Me tuhi e au tetahi korero motuhake tuhinga mo te karaati, mo te hunga katahi ano ka timata ki te mahi whakaoho ), a inaianei kei te raupapa.

Ka puta te whakawhanaketanga i roto i te reo Haere, a ko te paataka korero kei roto i nga poraka e penapenahia ana ko LevelDB.
Ko nga waahanga matua ko te kawa, te tūmau (e whakahaere ana i te TCP me te WebSocket - te tuatahi mo te tukutahi i te poraka, te tuarua mo te hono i nga kiritaki, te tuku i nga whakawhitinga me nga whakahau mai i te JavaScript, hei tauira.

Ka rite ki te korero, ko tenei poraka e tino hiahiatia ana ki te whakaaunoa me te tiaki i te whakawhitinga o nga hua i waenga i nga kaiwhakarato me nga kaihoko, e rua ranei i roto i te tangata kotahi. Kare enei tangata e tere ki te whakawhirinaki tetahi ki tetahi. Engari ko te mahi ehara i te mea ko te hanga "pukapuka" anake me te taatai ​​​​i hangaia, engari he punaha e whakahaere ana i te nuinga o nga mahi mahinga ka puta mai i te wa e mahi ana me te huringa ora o te hua. Ko te bytecode te kawenga mo tenei take, he rite tonu ki nga poraka poraka, kei te rongoa i roto i nga whakaurunga me nga putanga o nga whakawhitinga (ko nga whakawhitinga ake kei te rongoa i roto i nga poraka, ko nga poraka kei te LevelDB kua tohua i mua i te whakatakotoranga GOB). Tuatahi, me korero tatou mo te kawa me te tūmau (aka node).

Ehara i te mea uaua te kawa, ko tana kaupapa katoa ko te huri ki te aratau ki te uta i etahi raraunga, i te nuinga o te waa he poraka, he tauwhitinga ranei, hei whakautu ki tetahi rarangi whakahau motuhake, me te hiahia hoki mo te whakawhiti pukapuka, kia mohio ai te node ko wai ia. kei te hono me te pehea e mahi ai a raatau pakihi (ko nga pona e hono ana mo te huihuinga tukutahi e kiia ana he "noho tata" no te mea e mohiotia ana to ratou IP me o raatau raraunga whenua kei roto i te mahara).

Ko nga kōpaki (ko nga raarangi e kiia ana e Linux) i runga i te maarama o nga kaiwhakariterite a Go ka kiia he kohinga, na i te timatanga o ia konae me te waehere Haere mai i tenei raarangi ka tuhia e ratou te kōpaki folder_name_where_this_file kei reira. Ki te kore, kare e taea e koe te whangai i te kete ki te kaitoi. Kaati, ehara tenei i te mea ngaro mo te hunga e mohio ana ki tenei reo. Ko enei nga kete:

  • Whakawhitiwhiti whatunga (tūmau, kiritaki, kawa)
  • Nga hanganga o nga raraunga rongoa me te tuku (poraka, tauwhitinga)
  • Pātengi Raraunga (chain paraka)
  • Whakaaetanga
  • Mīhini mariko tāpae (xvm)
  • Auxiliary (crypto, momo) koinei noa mo naianei.

Anei te hono ki te github

He putanga ako tenei, kaore he taunekeneke i waenga i nga tukanga me etahi waahanga whakamatautau, engari ko te hanganga e rite ana ki te waahanga e whakahaerehia ana. Mena kei a koe tetahi mea hei whakaaro i roto i nga korero, ka koa ahau ki te whai whakaaro ki te whakawhanaketanga ake. Na inaianei mo te whakamaramatanga o te tūmau me te kawa.

Me titiro ki te tūmau i te tuatahi.

Ka mahi te raupaparorohiko iti hei tūmau raraunga e rere ana i runga ake o te kawa TCP ma te whakamahi i nga hanganga raraunga mai i te kete kawa.

Ka whakamahia e te mahinga nga kohinga e whai ake nei: tūmau, kawa, momo. I roto i te kete ake tcp_server.go kei roto te hanganga raraunga mahi.

type Serve struct {
	Port string
	BufSize int
	ST *types.Settings
}

Ka taea e ia te whakaae ki nga tawhā e whai ake nei:

  • Tauranga whatunga ka whakawhiti raraunga
  • Kōnae whirihoranga tūmau i te hōputu JSON
  • Kara mo te rere i roto i te aratau patuiro (poraka motuhake)

Te ahunga whakamua:

  • Ka panui te whirihoranga mai i te konae JSON
  • Kua takina te haki aratau patuiro: mena kua whakaritea, kaore i te whakarewahia te raarangi tukutahi whatunga, kaore ano hoki te poraka e utaina.
  • Ka timata i te hanganga raraunga whirihoranga me te timata i te tūmau

tūmau

  • Ka kawe i te whakarewatanga o te tūmau TCP me te taunekeneke whatunga i runga i te kawa.
  • He anga raraunga Ratonga kei roto ko te tau tauranga, te rahi o te parapara me te tohu tohu ki te hanganga momo.Tautuhinga
  • Ko te tikanga Run ka timata te taunekeneke whatunga (whakarongo mo nga hononga taumai i runga i te tauranga kua tohua, ka tae mai he hononga hou, ka whakawhitia tana tukatuka ki te tikanga kakau motuhake i roto i te miro hou)
  • В hapai Ko nga raraunga mai i te hononga ka panuitia ki roto i te papaa, ka huri hei tohu aho, ka tukuna ki kawa.Kowhiri
  • kawa.Kowhiri hoki mai hua he hapa ranei. hua katahi ka whakawhitia ki kawa.Whakamaorie hoki mai ana intrpr - momo momo InterpreteData, he hapa ranei i te tukatuka i te hua whiriwhiri
  • Na ka mahia te pana intrpr.Ngā Tono[0] e taki ana i tetahi o: hua, inv, hapa a he wahanga Taunoa
  • I te wahanga hua ka kitea te whakawhiti ma te uara intrpr.Ngā Tono[1] e taki ana i nga uara te roanga parepare и putanga (i ia ahuatanga ka kiia ko te mahi e rite ana)

Nga Mahi GetVersion и Roa Pūreirei kei roto i te kōnae srvlib.go mōkihi tūmau

GetVersion(conn net.Conn, version string)

ka tuhi noa ki te papatohu ka tukuna te putanga i tukuna i roto i te tawhā ki te kiritaki:

conn.Write([]byte("result:" + version))

.
mahi

BufferLength(conn net.Conn, intrpr *protocol.InterpreteData)

ka utaina he poraka, tauwhitinga, etahi atu raraunga motuhake ranei penei:

  • Ka tā ki te papatohu te momo raraunga kua tohua ki te kawa me whakaae:
    fmt.Println("DataType:", intrpr.Commands[2])
  • Ka panui te uara intrpr.Te tinana ki te taurangi tau buf_len
  • Ka waihanga he parepare newbuf rahi kua tohua:
    make([]byte, buf_len)
  • Ka tukuna he whakautu pai:
    conn.Write([]byte("result:ok"))
  • Whakakiia katoatia te parare mai i te awa panui:
    io.ReadFull(conn, newbuf)

    .

  • Ka tā i ngā ihirangi o te pūreirei ki te papatohu
    fmt.Println(string(newbuf))

    me te maha o nga paita panui

    fmt.Println("Bytes length:", n)
  • Ka tukuna he whakautu pai:
    conn.Write([]byte("result:ok"))

Kua whirihorahia nga tikanga mai i te kete tūmau ki te tukatuka i nga raraunga kua riro ma te whakamahi i nga mahi mai i te kete kawa.

Tuhinga

Ko te kawa he tikanga e whakaatu ana i nga raraunga i roto i te whakawhiti whatunga.

Kōwhiringa(str aho) (aho, hapa) ka mahi i te tukatuka tuatahi o nga raraunga ka riro i te tūmau, ka whiwhi tohu aho o te raraunga hei whakaurunga me te whakahoki mai i tetahi aho kua rite mo Kaiwhakamaori:

  • Ka wehea te aho whakauru ki te upoko me te tinana ma te whakamahi ReqParseN2(str)
  • ka wehea te mahunga ki nga huānga ka tuu ki tetahi poro whakahau ma te whakamahi i te ReqParseHead(upoko)
  • В whakawhiti(tohu[0]) tīpakohia te tono kua riro (cmd, kī, wāhitau ka puta ranei te waahanga Taunoa)
  • E 2 nga whakahau kua takina ki te cmd whakawhiti(whakahau[1]) — roa и te hurihanga.
  • roa ka taki i te momo raraunga kei roto whakahau[2] ka penapena ki roto momo raraunga
  • Ka tirohia e tinana he uara aho kei roto
    len(body) < 1
  • Whakahokia te aho whakautu:
    "result:bufferlength:" + datatype + "/" + body
  • te hurihanga ka whakahokia he aho
    return "result:version/auto"

Kaiwhakamaori

Kei roto te hanganga InterpreteData me te mahi tukatuka tuarua o nga raraunga i whakahokia mai kōwhiringa aho me te hanga mea InterpreteData.

type InterpreteData struct {
	Head string
	Commands []string
	Body string
	IsErr bool
	ErrCode int 
	ErrMessage string
}

mahi

Interprete(str string) (*InterpreteData, error)

ka whakaae ki te aho hua me te hanga me te whakahoki tohutoro ki te ahanoa InterpreteData.

Te ahunga whakamua:

  • Waihoki kōwhiringa ka tangohia te upoko me te tinana ma te whakamahi ReqParseN2(str)
  • ka wehea te upoko ki nga huānga ma te whakamahi ReqParseHead(upoko)
  • Kua arawhiti te ahanoa InterpreteData a ka whakahokia mai he tohu ki a ia.

res := &InterpreteData{
	Head: head,
	Commands: commands,
	Body: body,
}
return res, nil

Ka whakamahia tenei mea i roto i server.go mōkihi matua.

Kiritaki

Kei roto i te kete kiritaki nga mahi TCPConnect и TCPResponseData.

mahi

TCPConnect(s *types.Settings, data []byte, payload []byte)

mahi penei:

  • Ka mahia he hononga ki te hononga kua tohua ki te ahanoa tautuhinga kua paahitia
    net.Dial("tcp", s.Host + ":" + s.Port)
  • Ko nga raraunga i tukuna i te tawhā raraunga ka tukuna:
    conn.Write(data)
  • Ka panuitia te whakautu
    resp, n, _ := TCPResponseData(conn, s.BufSize)

    ka taia ki te papatohu

    fmt.Println(string(resp[:n]))
  • Ki te whakawhiti ututaumaha katahi ka tukuna atu
    conn.Write(payload)

    ka panui ano hoki i te whakautu a te tūmau, ka tā ki te papatohu

mahi

 TCPResponseData(conn net.Conn, bufsiz int) ([]byte, int, error)

ka waihangahia he parepare o te rahi kua tohua, ka panui i te whakautu a te tūmau ki reira ka whakahoki mai i tenei parapare me te maha o nga paita panui, me tetahi ahanoa hapa.

Nga mahi a te kiritaki

Ka mahi ki te tuku whakahau ki nga tūmau node, me te whiwhi tatauranga poto me te whakamatautau.

Ka taea te whakaae ki nga tawhā e whai ake nei: te konae whirihora i roto i te whakatakotoranga JSON, nga raraunga ka tukuna ki te tūmau hei aho, te ara ki te konae ka tukuna ki te utu, te haki whakahiato node scheduler, te momo raraunga ka whakawhitia hei uara tau.

  • Te tiki i te whirihoranga
    st := types.ParseConfig(*config)
  • Mena ka paahitia te haki emu, ka timata kaihoroi
  • Mena ka tukuna te haki f e tohu ana i te ara ki te konae, ka utaina ona raraunga ki roto fdb a ka tukuna te ihirangi ki te tūmau
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • Mena kaore i tohua te konae, ka tukuna noa nga raraunga mai i te haki -d:
    client.TCPConnect(st, []byte(*data), nil)

Ko enei katoa he whakaaturanga ngawari e whakaatu ana i te hanganga o te kawa. I te wa o te whakawhanaketanga, ka taapirihia nga mahi e tika ana ki tona hanganga.

I te waahanga tuarua ka korero ahau mo nga hanganga raraunga mo nga poraka me nga whakawhitiwhitinga, i roto i te 3 mo te WebSocket server mo te hono mai i te JavaScript, i te 4 ka titiro ahau ki te raupapa tukutahi, katahi he miihini puranga e tukatuka ana i te bytecode mai i nga whakauru me nga putanga, te tuhi me te puna mo nga putanga.

Source: will.com

Tāpiri i te kōrero