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에 따라 라이센스가 부여됩니다.