Golang GO와 마이크로서비스 ChatServer 1
4064 단어 golang
인연
최근 읽기<>(유금량, 2021.1) 본 시리즈 노트는 golang으로 연습할 예정
케이스 요구사항(채팅 서버)
목표
설계
IMsg.go
메시지 인터페이스를 정의하고 관련 메시지의 실현을 정의합니다.임의의 메시지 내용의 디코딩을 편리하게 하기 위해, 메시지 전송 시,base64 디코딩을 사용한다package chat_server
import (
"encoding/base64"
"fmt"
)
type IMsg interface {
Encode() string
}
type NameMsg struct {
Name string
}
func (me *NameMsg) Encode() string {
return fmt.Sprintf("NAME %s", base64.StdEncoding.EncodeToString([]byte(me.Name)))
}
type ChatMsg struct {
Name string
Words string
}
func (me *ChatMsg) Encode() string {
return fmt.Sprintf("CHAT %s %s",
base64.StdEncoding.EncodeToString([]byte(me.Name)),
base64.StdEncoding.EncodeToString([]byte(me.Words)),
)
}
IMsgDecoder.go
메시지 디코더 및 그 실현 정의package chat_server
import (
"encoding/base64"
"strings"
)
type IMsgDecoder interface {
Decode(line string) (bool, IMsg)
}
type tMsgDecoder struct {
}
func (me *tMsgDecoder) Decode(line string) (bool, IMsg) {
items := strings.Split(line, " ")
size := len(items)
if items[0] == "NAME" && size == 2 {
name, err := base64.StdEncoding.DecodeString(items[1])
if err != nil {
return false, nil
}
return true, &NameMsg{
Name: string(name),
}
}
if items[0] == "CHAT" && size == 3 {
name, err := base64.StdEncoding.DecodeString(items[1])
if err != nil {
return false, nil
}
words, err := base64.StdEncoding.DecodeString(items[2])
if err != nil {
return false, nil
}
return true, &ChatMsg{
Name: string(name),
Words: string(words),
}
}
return false, nil
}
var MsgDecoder = &tMsgDecoder{}
IChatClient.go
채팅 클라이언트 인터페이스 정의package chat_server
type IChatClient interface {
Dial(address string) error
Send(msg IMsg)
RecvHandler(handler RecvFunc)
Close()
}
type RecvFunc func(msg IMsg)
tChatClient.go
채팅 클라이언트, IChatClient 인터페이스 구현package chat_server
import (
"bufio"
"net"
"sync/atomic"
)
type tChatClient struct {
conn net.Conn
closeFlag int32
closeChan chan bool
sendChan chan IMsg
name string
sendLogs []IMsg
recvLogs []IMsg
recvHandler RecvFunc
}
func DialChatClient(address string) (error, IChatClient) {
it := &tChatClient{
conn: nil,
closeFlag: 0,
closeChan: make(chan bool),
sendChan: make(chan IMsg),
name: "anonymous",
sendLogs: []IMsg{},
recvLogs: []IMsg{},
}
e := it.Dial(address)
if e != nil {
return e, nil
}
return nil, it
}
func (me *tChatClient) Dial(address string) error {
c, e := net.Dial("tcp", address)
if e != nil {
return e
}
me.conn = c
go me.beginWrite()
go me.beginRead()
return nil
}
func (me *tChatClient) isClosed() bool {
return me.closeFlag != 0
}
func (me *tChatClient) isNotClosed() bool {
return !me.isClosed()
}
func (me *tChatClient) Send(msg IMsg) {
if me.isNotClosed() {
me.sendChan
(미완성 미계속)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set container
There is no built-in set container in Go
How to implement Set
struct{} => type
struct{}{} => 0bytes
How to create
set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
package chat_server
import (
"encoding/base64"
"fmt"
)
type IMsg interface {
Encode() string
}
type NameMsg struct {
Name string
}
func (me *NameMsg) Encode() string {
return fmt.Sprintf("NAME %s", base64.StdEncoding.EncodeToString([]byte(me.Name)))
}
type ChatMsg struct {
Name string
Words string
}
func (me *ChatMsg) Encode() string {
return fmt.Sprintf("CHAT %s %s",
base64.StdEncoding.EncodeToString([]byte(me.Name)),
base64.StdEncoding.EncodeToString([]byte(me.Words)),
)
}
메시지 디코더 및 그 실현 정의
package chat_server
import (
"encoding/base64"
"strings"
)
type IMsgDecoder interface {
Decode(line string) (bool, IMsg)
}
type tMsgDecoder struct {
}
func (me *tMsgDecoder) Decode(line string) (bool, IMsg) {
items := strings.Split(line, " ")
size := len(items)
if items[0] == "NAME" && size == 2 {
name, err := base64.StdEncoding.DecodeString(items[1])
if err != nil {
return false, nil
}
return true, &NameMsg{
Name: string(name),
}
}
if items[0] == "CHAT" && size == 3 {
name, err := base64.StdEncoding.DecodeString(items[1])
if err != nil {
return false, nil
}
words, err := base64.StdEncoding.DecodeString(items[2])
if err != nil {
return false, nil
}
return true, &ChatMsg{
Name: string(name),
Words: string(words),
}
}
return false, nil
}
var MsgDecoder = &tMsgDecoder{}
IChatClient.go
채팅 클라이언트 인터페이스 정의package chat_server
type IChatClient interface {
Dial(address string) error
Send(msg IMsg)
RecvHandler(handler RecvFunc)
Close()
}
type RecvFunc func(msg IMsg)
tChatClient.go
채팅 클라이언트, IChatClient 인터페이스 구현package chat_server
import (
"bufio"
"net"
"sync/atomic"
)
type tChatClient struct {
conn net.Conn
closeFlag int32
closeChan chan bool
sendChan chan IMsg
name string
sendLogs []IMsg
recvLogs []IMsg
recvHandler RecvFunc
}
func DialChatClient(address string) (error, IChatClient) {
it := &tChatClient{
conn: nil,
closeFlag: 0,
closeChan: make(chan bool),
sendChan: make(chan IMsg),
name: "anonymous",
sendLogs: []IMsg{},
recvLogs: []IMsg{},
}
e := it.Dial(address)
if e != nil {
return e, nil
}
return nil, it
}
func (me *tChatClient) Dial(address string) error {
c, e := net.Dial("tcp", address)
if e != nil {
return e
}
me.conn = c
go me.beginWrite()
go me.beginRead()
return nil
}
func (me *tChatClient) isClosed() bool {
return me.closeFlag != 0
}
func (me *tChatClient) isNotClosed() bool {
return !me.isClosed()
}
func (me *tChatClient) Send(msg IMsg) {
if me.isNotClosed() {
me.sendChan
(미완성 미계속)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set container
There is no built-in set container in Go
How to implement Set
struct{} => type
struct{}{} => 0bytes
How to create
set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
package chat_server
type IChatClient interface {
Dial(address string) error
Send(msg IMsg)
RecvHandler(handler RecvFunc)
Close()
}
type RecvFunc func(msg IMsg)
채팅 클라이언트, IChatClient 인터페이스 구현
package chat_server
import (
"bufio"
"net"
"sync/atomic"
)
type tChatClient struct {
conn net.Conn
closeFlag int32
closeChan chan bool
sendChan chan IMsg
name string
sendLogs []IMsg
recvLogs []IMsg
recvHandler RecvFunc
}
func DialChatClient(address string) (error, IChatClient) {
it := &tChatClient{
conn: nil,
closeFlag: 0,
closeChan: make(chan bool),
sendChan: make(chan IMsg),
name: "anonymous",
sendLogs: []IMsg{},
recvLogs: []IMsg{},
}
e := it.Dial(address)
if e != nil {
return e, nil
}
return nil, it
}
func (me *tChatClient) Dial(address string) error {
c, e := net.Dial("tcp", address)
if e != nil {
return e
}
me.conn = c
go me.beginWrite()
go me.beginRead()
return nil
}
func (me *tChatClient) isClosed() bool {
return me.closeFlag != 0
}
func (me *tChatClient) isNotClosed() bool {
return !me.isClosed()
}
func (me *tChatClient) Send(msg IMsg) {
if me.isNotClosed() {
me.sendChan
(미완성 미계속)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.