Go๋ฅผ ํ™œ์šฉํ•œ ์‚ฐ์—…์šฉ ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ. 1 ๋ถ€

์ €๋Š” ์ง€๊ธˆ๊นŒ์ง€ XNUMX๊ฐœ์›” ๋™์•ˆ โ€œ๋ธ”๋ก์ฒด์ธ ๊ธฐ๋ฐ˜ ์ •๋ถ€ ๋ฐ ์‚ฐ์—… ๋ถ€๋ฌธ์˜ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ๋ฐ ๊ด€๋ฆฌ ๋„๊ตฌ ๊ฐœ๋ฐœโ€์ด๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•ด ์™”์Šต๋‹ˆ๋‹ค.
์ด์ œ ์ œ๊ฐ€ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€ ๋ง์”€๋“œ๋ฆฌ๊ณ , ์ด์ œ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Go๋ฅผ ํ™œ์šฉํ•œ ์‚ฐ์—…์šฉ ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ. 1 ๋ถ€

์ด๊ฒƒ์€ ์ผ๋ จ์˜ ๊ธฐ์‚ฌ ์ค‘ ์ฒซ ๋ฒˆ์งธ ๊ธฐ์‚ฌ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์„œ๋ฒ„์™€ ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋…์ž๋Š” ์ด๋Ÿฌํ•œ ๋ธ”๋ก์ฒด์ธ ์š”์†Œ์— ๋Œ€ํ•ด ์ž์‹ ๋งŒ์˜ ๋ฒ„์ „์„ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค โ€” ๋ธ”๋ก์ฒด์ธ ๋ฐ ๊ฑฐ๋ž˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ตฌํ˜„ํ•˜๋Š” ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ž‘๋…„์— ์—ด๋ฆฐ Digital Breakthrough ํ•ด์ปคํ†ค์—์„œ ๊ทธ๋“ค์€ ๋ถ„์‚ฐ์›์žฅ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฐ์—…๊ณผ ๋””์ง€ํ„ธ ๊ฒฝ์ œ์— ์œ ์šฉํ•œ ์‹œ์Šคํ…œ์„ ๋งŒ๋“œ๋Š” ์•„์ด๋””์–ด๋ฅผ ๋‚ด๋†“์•˜๊ณ , ํ˜์‹  ์ง€์› ๊ธฐ๊ธˆ์˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๋ณด์กฐ๊ธˆ๋„ ์ง€๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ง‰ ์Šคํƒ€ํŠธ์—…์„ ์‹œ์ž‘ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๋ณด์กฐ๊ธˆ ๊ด€๋ จ ๊ธฐ์‚ฌ), ์ด์ œ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์€ Go ์–ธ์–ด๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ ๋ธ”๋ก์ด ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” LevelDB์ž…๋‹ˆ๋‹ค.
์ฃผ์š” ๋ถ€๋ถ„์€ ํ”„๋กœํ† ์ฝœ, ์„œ๋ฒ„(TCP ๋ฐ WebSocket์„ ์‹คํ–‰ํ•˜๋Š” ์„œ๋ฒ„)์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ๋ธ”๋ก์ฒด์ธ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ, JavaScript์—์„œ ํŠธ๋žœ์žญ์…˜ ๋ฐ ๋ช…๋ น ์ „์†ก์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด, ์ด ๋ธ”๋ก์ฒด์ธ์€ ์ฃผ๋กœ ๊ณต๊ธ‰์—…์ฒด์™€ ๊ณ ๊ฐ ์‚ฌ์ด ๋˜๋Š” ํ•œ ์‚ฌ๋žŒ์˜ ์ œํ’ˆ ๊ตํ™˜์„ ์ž๋™ํ™”ํ•˜๊ณ  ๋ณดํ˜ธํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‚ฌ๋žŒ๋“ค์€ ์„œ๋กœ๋ฅผ ์‹ ๋ขฐํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋‘๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž„๋ฌด๋Š” ๋‚ด์žฅ๋œ ๊ณ„์‚ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "์ˆ˜ํ‘œ์žฅ"์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ œํ’ˆ ์ˆ˜๋ช…์ฃผ๊ธฐ ์ž‘์—… ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ผ์ƒ์ ์ธ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ๋ธ”๋ก์ฒด์ธ์˜ ๊ด€๋ก€๋Œ€๋กœ ํŠธ๋žœ์žญ์…˜์˜ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค(ํŠธ๋žœ์žญ์…˜ ์ž์ฒด๋Š” ๋ธ”๋ก์— ์ €์žฅ๋˜๊ณ  LevelDB์˜ ๋ธ”๋ก์€ GOB ํ˜•์‹์œผ๋กœ ์‚ฌ์ „ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค). ๋จผ์ € ํ”„๋กœํ† ์ฝœ๊ณผ ์„œ๋ฒ„(๋…ธ๋“œ๋ผ๊ณ ๋„ ํ•จ)์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœํ† ์ฝœ์€ ๋ณต์žกํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์š”์ ์€ ํŠน๋ณ„ํ•œ ๋ช…๋ น์ค„์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ(์ผ๋ฐ˜์ ์œผ๋กœ ๋ธ”๋ก ๋˜๋Š” ํŠธ๋žœ์žญ์…˜)๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ์ธ๋ฒคํ† ๋ฆฌ ๊ตํ™˜์—๋„ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋…ธ๋“œ๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•(๋™๊ธฐํ™” ์„ธ์…˜์„ ์œ„ํ•ด ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋Š” IP๊ฐ€ ์•Œ๋ ค์ ธ ์žˆ๊ณ  ์ƒํƒœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋ฏ€๋กœ "์ด์›ƒ"์ด๋ผ๊ณ ๋„ ํ•จ)

Go ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ดํ•ดํ•˜๋Š” ํด๋”(Linux์—์„œ ๋ถ€๋ฅด๋Š” ๋””๋ ‰ํ† ๋ฆฌ)๋ฅผ ํŒจํ‚ค์ง€๋ผ๊ณ  ๋ถ€๋ฅด๋ฏ€๋กœ ์ด ๋””๋ ‰ํ† ๋ฆฌ์˜ Go ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฐ ํŒŒ์ผ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ํŒจํ‚ค์ง€๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํด๋”_์ด๋ฆ„_์ด_ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํŒจํ‚ค์ง€๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์— ๊ณต๊ธ‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„, ์ด๊ฒƒ์€ ์ด ์–ธ์–ด๋ฅผ ์•„๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋น„๋ฐ€์ด ์•„๋‹™๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋„คํŠธ์›Œํฌ ํ†ต์‹ (์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ, ํ”„๋กœํ† ์ฝœ)
  • ์ €์žฅ ๋ฐ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ(๋ธ”๋ก, ํŠธ๋žœ์žญ์…˜)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(๋ธ”๋ก์ฒด์ธ)
  • ์˜๊ฒฌ ์ผ์น˜
  • ์Šคํƒํ˜• ๊ฐ€์ƒ ๋จธ์‹ (xvm)
  • ์ง€๊ธˆ์€ ๋ณด์กฐ(์•”ํ˜ธํ™”, ์œ ํ˜•)๊ฐ€ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

github์— ๋Œ€ํ•œ ๋งํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ต์œก์šฉ ๋ฒ„์ „์ด๋ฉฐ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ๊ณผ ์—ฌ๋Ÿฌ ์‹คํ—˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ถ€์กฑํ•˜์ง€๋งŒ ๊ตฌ์กฐ๋Š” ๊ฐœ๋ฐœ์ด ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋Œ“๊ธ€๋กœ ์ œ์•ˆํ•˜์‹ค ์‚ฌํ•ญ์ด ์žˆ์œผ์‹œ๋ฉด ํ–ฅํ›„ ๊ฐœ๋ฐœ์— ๋ฐ˜์˜ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ํ”„๋กœํ† ์ฝœ.

๋จผ์ € ์„œ๋ฒ„๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์„œ๋ธŒ๋ฃจํ‹ด์€ ํ”„๋กœํ† ์ฝœ ํŒจํ‚ค์ง€์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TCP ํ”„๋กœํ† ์ฝœ ์œ„์—์„œ ์‹คํ–‰๋˜๋Š” ๋ฐ์ดํ„ฐ ์„œ๋ฒ„ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋ฃจํ‹ด์€ ๋‹ค์Œ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ฌ๊ธฐ๋Š” ์‚ฌ๋žŒ, ํ”„๋กœํ† ์ฝœ, ์œ ํ˜•. ํŒจํ‚ค์ง€ ์ž์ฒด์—๋Š” tcp_server.go ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํฌํ•จ ์„œ๋ธŒ.

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

๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๊ฐ€ ๊ตํ™˜๋  ๋„คํŠธ์›Œํฌ ํฌํŠธ
  • JSON ํ˜•์‹์˜ ์„œ๋ฒ„ ๊ตฌ์„ฑ ํŒŒ์ผ
  • ๋””๋ฒ„๊ทธ ๋ชจ๋“œ ์‹คํ–‰์„ ์œ„ํ•œ ํ”Œ๋ž˜๊ทธ(ํ”„๋ผ์ด๋น— ๋ธ”๋ก์ฒด์ธ)

์ง„์ „:

  • JSON ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ์„ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ๋””๋ฒ„๊ทธ ๋ชจ๋“œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์„ค์ •๋œ ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ ๋™๊ธฐํ™” ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š๊ณ  ๋ธ”๋ก์ฒด์ธ์ด ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ดˆ๊ธฐํ™” ๋ฐ ์„œ๋ฒ„ ์‹œ์ž‘

์„œ๋ฒ„

  • ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ผ TCP ์„œ๋ฒ„ ์‹œ์ž‘ ๋ฐ ๋„คํŠธ์›Œํฌ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ํฌํŠธ ๋ฒˆํ˜ธ, ๋ฒ„ํผ ํฌ๊ธฐ ๋ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ Serve ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•.์„ค์ •
  • Run ๋ฉ”์„œ๋“œ๋Š” ๋„คํŠธ์›Œํฌ ์ƒํ˜ธ ์ž‘์šฉ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค(์ง€์ •๋œ ํฌํŠธ์—์„œ ๋“ค์–ด์˜ค๋Š” ์—ฐ๊ฒฐ์„ ์ˆ˜์‹ ํ•˜๊ณ  ์ƒˆ ์—ฐ๊ฒฐ์ด ์ˆ˜์‹ ๋˜๋ฉด ํ•ด๋‹น ์ฒ˜๋ฆฌ๊ฐ€ ์ƒˆ ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ธ ํ•ธ๋“ค ๋ฉ”์„œ๋“œ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค).
  • ะ’ ํ•ธ๋“ค ์—ฐ๊ฒฐ์˜ ๋ฐ์ดํ„ฐ๋Š” ๋ฒ„ํผ๋กœ ์ฝํ˜€์ง€๊ณ  ๋ฌธ์ž์—ด ํ‘œํ˜„์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœํ† ์ฝœ.์„ ํƒ
  • ํ”„๋กœํ† ์ฝœ.์„ ํƒ ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ๋‹ค์Œ์œผ๋กœ ์ „์†ก ํ”„๋กœํ† ์ฝœ.ํ•ด์„์ด๋Š” ๋ฐ˜ํ™˜ ๋‚ด๋ถ€ - ์œ ํ˜•์˜ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ ํ•ด์„, ๋˜๋Š” ์„ ํƒ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ์Šค์œ„์น˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. intrpr.๋ช…๋ น[0] ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ, inv, ์˜ค๋ฅ˜ ๊ทธ๋ฆฌ๊ณ  ์„น์…˜์ด ์žˆ์–ด์š” ๋””ํดํŠธ ๊ฐ’
  • ์„น์…˜์—์„œ ๊ฒฐ๊ณผ ์Šค์œ„์น˜๋Š” ๊ฐ’์œผ๋กœ ๋ฐœ๊ฒฌ๋ฉ๋‹ˆ๋‹ค. 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)
  • ํ—ค๋“œ๋Š” ์š”์†Œ๋กœ ๋ถ„ํ• ๋˜๊ณ  ReqParseHead(head)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น ์Šฌ๋ผ์ด์Šค์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
  • ะ’ ์Šค์œ„์น˜(๋ช…๋ น[0]) ์ˆ˜์‹ ๋œ ๋ช…๋ น์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(cmd, ํ‚ค, ์ฃผ์†Œ ๋˜๋Š” ์„น์…˜์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๋””ํดํŠธ ๊ฐ’)
  • 2๊ฐœ์˜ ๋ช…๋ น์ด cmd์—์„œ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์Šค์œ„์น˜(๋ช…๋ น[1]) โ€” ๊ธธ์ด ะธ getversion.
  • ๊ธธ์ด ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น[2] ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค ๋ฐ์ดํ„ฐ ํ˜•์‹
  • ํ™•์ธ ๋ชธ ๋ฌธ์ž์—ด ๊ฐ’์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค
    len(body) < 1
  • ์‘๋‹ต ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    "result:bufferlength:" + datatype + "/" + body
  • getversion ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
    return "result:version/auto"

ํ†ต์—ญ์‚ฌ

InterpreteData ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•˜๊ณ  InterpreteData ๊ตฌ์กฐ์—์„œ ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ์˜ XNUMX์ฐจ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ ๋ฌธ์ž์—ด๊ณผ ๊ฐ์ฒด ํ˜•์„ฑ ๋ฐ์ดํ„ฐ ํ•ด์„.

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

๊ธฐ๋Šฅ

Interprete(str string) (*InterpreteData, error)

๋ฌธ์ž์—ด์„ ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค ๊ฒฐ๊ณผ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํ•ด์„.

์ง„์ „:

  • ์œ ์‚ฌํ•˜๊ฒŒ ์„ ํƒ ๋จธ๋ฆฌ์™€ ๋ชธํ†ต์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ถœ๋ฉ๋‹ˆ๋‹ค. ReqParseN2(str)
  • ๋จธ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋กœ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค. ReqParseHead(ํ—ค๋“œ)
  • ๊ฐœ์ฒด๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํ•ด์„ ๊ทธ๋ฆฌ๊ณ  ์ด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค:

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

์ด ๊ฐœ์ฒด๋Š” ๋‹ค์Œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. server.go ํŒจํ‚ค์ง€ ๋ฉ”์ธ.

Client

ํด๋ผ์ด์–ธํŠธ ํŒจํ‚ค์ง€์—๋Š” ๋‹ค์Œ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. TCPConnect ะธ 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)
  • emu ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์…ฐ๋“€๋Ÿฌ
  • ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” f ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ œ๊ณต๋˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ FDB ์ฝ˜ํ…์ธ ๊ฐ€ ์„œ๋ฒ„๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
    client.TCPConnect(st, []byte(CMD_BUFFER_LENGTH + ":" + strconv.Itoa(*t) + "/" + strconv.Itoa(fdblen)), fdb)
  • ํŒŒ์ผ์ด ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ํ”Œ๋ž˜๊ทธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹จ์ˆœํžˆ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. -d:
    client.TCPConnect(st, []byte(*data), nil)

์ด ๋ชจ๋“  ๊ฒƒ์€ ํ”„๋กœํ† ์ฝœ์˜ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋‹จ์ˆœํ™”๋œ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์ค‘์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ํ•ด๋‹น ๊ตฌ์กฐ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์—์„œ๋Š” ๋ธ”๋ก ๋ฐ ํŠธ๋žœ์žญ์…˜์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ , 3๋ถ€์—์„œ๋Š” JavaScript์—์„œ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ WebSocket ์„œ๋ฒ„์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ , 4๋ถ€์—์„œ๋Š” ๋™๊ธฐํ™” ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ดํŽด๋ณธ ๋‹ค์Œ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ, ์•”ํ˜ธํ™” ๋ฐ ์•”ํ˜ธํ™”์—์„œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šคํƒ ๋จธ์‹ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ์šฉ ํ’€.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€