ืืืจ ืืจืืขื ืืืืฉืื ืฉืื ื ืขืืื ืขื ืคืจืืืงื ืฉื ืงืจื "ืคืืชืื ืืื ืืื ืช ืืืืข ืื ืืืื ืืืืืจืื ืืืฉืืชืืื ืืชืขืฉืืืชืืื ืขื ืืกืืก ืืืืงืฆ'ืืื".
ืขืืฉืื ืื ื ืจืืฆื ืืกืคืจ ืืื ืขื ืืื ืืชืืืชื ืืช ืืคืจืืืงื ืืื, ืืขืืฉืื ืืชืืจ ืืช ืงืื ืืชืืื ืืช ืืคืืจืื.
ืืื ืืืืืจ ืืจืืฉืื ืืกืืจืช ืืืืจืื. ืืื ืื ื ืืชืืจ ืืช ืืฉืจืช ืืืคืจืืืืงืื. ืืืขืฉื, ืืงืืจื ืืืื ืืคืืื ืืืชืื ืืจืกืืืช ืืฉืื ืืืจืืืื ืืืืืงืฆ'ืืื ืืืื.
ืืฉื ื ืฉืขืืจื, ืืืืงืชืื ืคืจืืฆืช ืืจื ืืืืืืืืช, ืื ืืขืื ืจืขืืื ืืืฆืืจ ืืขืจืืช ืฉืืืืฉืืช ืืชืขืฉืืื ืืืืืืื ืืืืืืืืืช ืืืืฆืขืืช ืืื ืืืืืืืช ืกืคืจื ืืฉืืื ืืช ืืืืืจืื; ืืื ืื ืืื ืคืง ืืขื ืง ืืคืืชืื ืขื ืืื ืงืจื ืืกืืืข ืืืืฉื ืืช (ืื ื ืฆืจืื ืืืชืื ื ืคืจื ืืืืจ ืขื ืืืขื ืง, ืืื ืฉืจืง ืืชืืื ืืขืฉืืช ืกืืืจืืืคืื), ืืขืืฉืื ืืกืืจ.
ืืคืืชืื ืืชืืฆืข ืืฉืคืช Go, ืืืกื ืื ืชืื ืื ืื ืืืืืกื ืื ืืืืืงืื ืืื LevelDB.
ืืืืงืื ืืขืืงืจืืื ืื ืืคืจืืืืงืื, ืืฉืจืช (ืฉืืจืืฅ TCP ื-WebSocket - ืืจืืฉืื ืืกื ืืจืื ืืืืืงืฆ'ืืื, ืืฉื ื ืืืืืืจ ืืงืืืืช, ืฉืืืืช ืขืกืงืืืช ืืคืงืืืืช ื-JavaScript, ืืืฉื.
ืืืืืจ, ืืืืืงืฆ'ืืื ืืื ื ืืืฅ ืืขืืงืจ ืืื ืืืื ืืืืื ืขื ืืืืคืช ืืืฆืจืื ืืื ืกืคืงืื ืืืงืืืืช, ืื ืฉื ืืื ืืืื ืืื. ืืื ืฉืื ืืืื ืื ืืืืจืื ืืกืืื ืื ืขื ืื. ืืื ืืืฉืืื ืืื ืื ืจืง ืืืฆืืจ "ืคื ืงืก ืฆ'ืงืื" ืขื ืืืฉืืื ืืืื ื, ืืื ืืขืจืืช ืฉืืืื ืช ืืช ืจืื ืืืฉืืืืช ืืฉืืจืชืืืช ืฉืขืืืืช ืืขืืืื ืขื ืืืืืจ ืืื ืืืืฆืจ. ื-bytecode ืฉืืืจืื ืืขื ืืื ืื, ืืืงืืื ืืืืืงืฆ'ืืื, ื ืฉืืจ ืืื ืืกืืช ืืืืฆืืืืช ืฉื ืืจื ืืงืฆืืืช (ืืขืกืงืืืช ืขืฆืื ืืืืืกื ืืช ืืืืืงืื, ืืืืืงืื ื-LevelDB ืืงืืืืื ืืจืืฉ ืืคืืจืื GOB). ืจืืฉืืช, ืืืื ื ืกืคืจ ืืื ืขื ืืคืจืืืืงืื ืืืฉืจืช (ืืืืื ื ืื ืฆืืืช).
ืืคืจืืืืงืื ืื ืืกืืื, ืื ืืงืืข ืฉืื ืืื ืืขืืืจ ืืืฆื ืฉื ืืขืื ืช ื ืชืื ืื ืืกืืืืื, ืืืจื ืืื ืืืืง ืื ืืจื ืืงืฆืื, ืืชืืืื ืืฉืืจืช ืคืงืืื ืืืืืืช, ืืืื ื ืืืฅ ืื ืืืืืคืช ืืืื, ืืื ืฉืืฆืืืช ืืืืข ืื ืืื. ืืืืืจ ืืืื ืืฉ ืืื ืขืกืงืื ืืขืฉืืช (ืืฆืืชืื ืืืืืืจืื ืืกืฉื ืืกื ืืจืื ื ืงืจืืื ืื "ืฉืื ืื" ืืืืืื ืฉื-IP ืฉืืื ืืืืข ืื ืชืื ื ืืืฆื ืฉืืื ืืืืืกื ืื ืืืืืจืื).
ืชืืงืืืช (ืกืคืจืืืช ืืคื ืฉืืื ืืงืก ืืื ื ืืืชื) ืืืื ืช ืืชืื ืชื Go ื ืงืจืืืช ืืืืืืช, ืืื ืืชืืืืช ืื ืงืืืฅ ืขื ืงืื Go ืืืกืคืจืืื ืืื ืื ืืืชืืื ืืืืื folder_name_where_this_file ื ืืฆื. ืืืจืช, ืื ืชืืื ืืืืื ืืช ืืืืืื ืืืืืจ. ืืืื, ืื ืื ืกืื ืืื ืฉืืืืข ืืช ืืฉืคื ืืื. ืืื ืืืืืืืช:
- ืชืงืฉืืจืช ืจืฉืช (ืฉืจืช, ืืงืื, ืคืจืืืืงืื)
- ืืื ืื ืฉื ื ืชืื ืื ืืืืืกื ืื ืืืฉืืืจืื (ืืกืืื, ืขืกืงื)
- ืืกื ื ืชืื ืื (ืืืืงืฆ'ืืื)
- ืงืึนื ืกึถื ืืึผืก
- ืืืื ื ืืืจืืืืืืช ืืืขืจืืช (xvm)
- ืขืืจ (ืงืจืืคืื, ืกืืืื) ืื ืืื ืืขืช ืขืชื.
ืืืื ืืจืกื ืืื ืืืืช, ืืื ืืกืจื ืืื ืืจืืงืฆืื ืืื-ืชืืืืืืช ืืืกืคืจ ืืจืืืืื ื ืืกืืื ืืื, ืื ืืืื ื ืชืืื ืืื ืฉืขืืื ืืชืืฆืข ืืคืืชืื. ืื ืืฉ ืื ืืฉืื ืืืฆืืข ืืืขืจืืช, ืืฉืื ืืงืืช ืืืช ืืืฉืืื ืืืืฉื ืืคืืชืื. ืืขืืฉืื ืืืกืืจ ืขื ืืฉืจืช ื ืคืจืืืืงืื.
ืืื ื ืกืชืื ืงืืื ืขื ืืฉืจืช.
ืชืช ืฉืืจืช ืืฉืจืช ืคืืขืืช ืืฉืจืช ื ืชืื ืื ืืคืืขื ืขื ืืื ืคืจืืืืงืื TCP ืืืืฆืขืืช ืืื ื ื ืชืื ืื ืืืืืืช ืืคืจืืืืงืื.
ืืฉืืจื ืืฉืชืืฉืช ืืืืืืืช ืืืืืช: ืฉืจืช, ืคืจืืืืงืื, ืกืืืื. ืืืืืื ืขืฆืื tcp_server.go ืืืื ืืื ื ื ืชืื ืื ืึฐืฉืึธืจึตืช.
type Serve struct {
Port string
BufSize int
ST *types.Settings
}
ืื ืืืื ืืงืื ืืช ืืคืจืืืจืื ืืืืื:
- ืืฆืืืช ืจืฉืช ืฉืืจืื ืืืืืคื ื ืชืื ืื
- ืงืืืฅ ืชืฆืืจืช ืืฉืจืช ืืคืืจืื JSON
- ืกืื ืืืคืขืื ืืืฆื ื ืืคืื ืืืืื (ืืืืงืฆ'ืืื ืคืจืื)
ืืชืงืืืืช:
- ืงืืจื ืชืฆืืจื ืืงืืืฅ JSON
- ืืื ืืฆื ื ืืคืื ืืืืื ืืกืืื: ืื ืืื ืืืืืจ, ืืชืืื ืืกื ืืจืื ืฉื ืืจืฉืช ืื ืืืคืขื ืื- blockchain ืื ื ืืขื
- ืืชืืื ืืื ื ื ืชืื ื ืืชืฆืืจื ืืืคืขืืช ืืฉืจืช
ืฉืจืช
- ืืืฆืข ืืช ืืฉืงืช ืฉืจืช ื-TCP ืืืืื ืืจืืงืฆืื ืืจืฉืช ืืืชืื ืืคืจืืืืงืื.
- ืืฉ ืื ืืื ื ื ืชืื ืื ืฉื Serve ืืืืจืื ืืืกืคืจ ืืฆืืื, ืืืื ืืืืจ ืืืฆืืืข ืืืื ื ืกืืืื.ืืืืจืืช
- ืฉืืืช ืืืคืขืื ืืชืืืื ืืื ืืจืืงืฆืื ืืจืฉืช (ืืืื ื ืืืืืืจืื ื ืื ืกืื ืืคืืจื ื ืชืื, ืืืฉืจ ืืชืงืื ืืืืืจ ืืืฉ, ืืขืืืื ืฉืื ืืืขืืจ ืืฉืืืช ืืืืคืื ืืคืจืื ืืฉืจืฉืืจ ืืืฉ)
- ะ ืืืคื ื ืชืื ืื ืืืืืืืจ ื ืงืจืืื ืืืืืจ, ืืืืจืื ืืืืฆืื ืืืจืืืช ืืืืขืืจืื ืื ืคืจืืืืงืื.ืืืืจื
- ืคืจืืืืงืื.ืืืืจื ืืืืจืืช ืชืืฆืื ืื ืืืจื ืืฉืืืื. ืชืืฆืื ืืืืจ ืืื ืืืขืืจ ื ืคืจืืืืงืื.ืืคืจืฉืฉืืืืืจื intrpr - ืืืืืืงื ืืกืื InterpreteData, ืื ืืืจื ืืฉืืืื ืืขืืืื ืชืืฆืืช ืืืืืจื
- ืืืืจ ืืื ืืืขืืจ ืืชืืฆืข intrpr.Commands[0] ืฉืืืืง ืืื ื: ืชืืฆืื, inv, error ืืืฉ ืงืืข ืืจืืจืช ืืืื
- ืืงืืข ืชืืฆืื ืืชื ื ืืฆื ืืคื ืขืจื intrpr.Commands[1] ืฉืืืืง ืืช ืืขืจืืื ืืืจื ืืืฅ ะธ ืืจืกื (ืืื ืืงืจื ื ืงืจืืช ืืคืื ืงืฆืื ืืืชืืืื)
ืคืื ืงืฆืืืช GetVersion ะธ ืืืจื ืืืืจ ื ืืฆืืื ืืงืืืฅ 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
- ืืืฆืจ ืืืฆืฅ newbuf ืืืื ืฉืฆืืื:
make([]byte, buf_len)
- ืฉืืื ืชืืืื ืืกืืจ:
conn.Write([]byte("result:ok"))
- ืืืื ืืืืืืื ืืช ืืืืืจ ืืืจื ืืงืจืืื:
io.ReadFull(conn, newbuf)
.
- ืืืคืืก ืืช ืชืืื ืืืืืจ ืืงืื ืกืืื
fmt.Println(string(newbuf))
ืืืกืคืจ ืืืชืื ืฉื ืงืจืื
fmt.Println("Bytes length:", n)
- ืฉืืื ืชืืืื ืืกืืจ:
conn.Write([]byte("result:ok"))
ืฉืืืืช ืืืืืืช ืืฉืจืช ืืืืืจืืช ืืขืืืื ื ืชืื ืื ืฉืืชืงืืื ืืืืฆืขืืช ืคืื ืงืฆืืืช ืืืืืืื ืคืจืืืืงืื.
ืคืจืืืืงืื
ืคืจืืืืงืื ืืฉืืฉ ืืืืฆืขื ืืืืืฆื ื ืชืื ืื ืืืืืืคื ืจืฉืชืืช.
Choice(str string) (ืืืจืืืช, ืฉืืืื) ืืืฆืข ืขืืืื ืจืืฉืื ื ืฉื ื ืชืื ืื ืืืชืงืืืื ืขื ืืื ืืฉืจืช, ืืงืื ืืืฆืื ืืืจืืืช ืฉื ืื ืชืื ืื ืืงืื ืืืืืืจ ืืืจืืืช ืฉืืืื ื ืขืืืจ ืึฐืชืึผืจืึฐืึธื:
- ืืืจืืืช ืืงืื ืืคืืฆืืช ืืจืืฉ ืืืืืฃ ืืืืฆืขืืช ReqParseN2(str)
- head ืืคืืฆื ืืืืื ืืื ืืืืืงื ืืคืจืืกืช ืคืงืืืืช ืืืืฆืขืืช ReqParseHead(head)
- ะ switch(ืคืงืืืืช[0]) ืืืจ ืืช ืืคืงืืื ืฉืืชืงืืื (cmd, ืืคืชื, ืืชืืืช ืื ืฉืืงืืข ืืืคืขื ืืจืืจืช ืืืื)
- 2 ืคืงืืืืช ืืกืืื ืืช ื-cmd switch(ืคืงืืืืช[1]) - ืืืจื ะธ getversion.
- ืืืจื ืืืืง ืืช ืกืื ืื ืชืื ืื ืคืงืืืืช[2] ืืฉืืืจ ืืืชื ืคื ืืื ืกืื ืืืืข
- ืืืืง ืืช ืื ืืึผืฃ ืืืื ืขืจื ืืืจืืืช
len(body) < 1
- ืืืืืจื ืืช ืืืจืืืช ืืชืืืื:
"result:bufferlength:" + datatype + "/" + body
- getversion ืืืืืจ ืืืจืืืช
return "result:version/auto"
ืึฐืชืึผืจืึฐืึธื
ืืืื ืืช ืืื ื InterpreteData ืืืืฆืข ืขืืืื ืืฉื ื ืฉื ืื ืชืื ืื ืืืืืืจืื ืืื ืืืืจื ืืืชืจืื ืืืฆืืจืช ืืืืืืงื InterpreteData.
type InterpreteData struct {
Head string
Commands []string
Body string
IsErr bool
ErrCode int
ErrMessage string
}
ืคืื ืงืฆืื
Interprete(str string) (*InterpreteData, error)
ืืงืื ืืืจืืืช ืชืืฆืื ืืืืฆืจ ืืืืืืจ ืืชืืืืกืืช ืืืืืืืงื InterpreteData.
ืืชืงืืืืช:
- ืืืืคื ืืืื ืืืืจื ืจืืฉ ืืืืฃ ื ืฉืืคืื ืืืืฆืขืืช ReqParseN2(str)
- ืืจืืฉ ืืืืืง ืืืืื ืืื ืืืืฆืขืืช ReqParseHead(head)
- ืืืืืืืงื ืืืืชืื InterpreteData ืืืฆืืืข ืืืื ืืืืืจ:
res := &InterpreteData{
Head: head,
Commands: commands,
Body: body,
}
return res, nil
ืืืืืืงื ืื ืืฉืืฉ ื server.go ืืืืืื ืืจืืฉืืช.
ืืงืื
ืืืืืช ืืืงืื ืืืืื ืืช ืืคืื ืงืฆืืืช TCPConnect ะธ TCPResponseData.
ืคืื ืงืฆืื
TCPConnect(s *types.Settings, data []byte, payload []byte)
ืขืืื ืื:
- ื ืืฆืจ ืืืืืจ ืืืืืืจ ืฉืฆืืื ืืืืืืืงื ืืืืืจืืช ืฉืขืืจ
net.Dial("tcp", s.Host + ":" + s.Port)
- ืื ืชืื ืื ืืืืขืืจืื ืืคืจืืืจ ืื ืชืื ืื ืืืขืืจืื:
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 ืขื ืฉืจืช WebSocket ืืืืืืจ ื-JavaScript, ื-4 ืืกืชืื ืขื ืืชืืื ืืกื ืืจืื, ืืื ืืืื ืช ืืืกื ืืช ืฉืืขืืืช ืงืื ืืชืื ืืื ืืกืืช ืืืฆืืืืช, ืงืจืืคืืืืจืคืื ื ืืจืืืืช ืืชืคืืงืืช.
ืืงืืจ: www.habr.com