golang 웹소켓 긴 연결
2352 단어 GOlang
설계 구조:
type Longsocket struct {
Ws *websocket.Conn
writeCh chan []byte
readCh chan []byte
ShakeHand bool
Url string
Protocol string
Origin string
BufferSize int
Status int
mu sync.Mutex
}
긴 연결은'writeCh'통로를 통해 연결측에 자발적으로 메시지를 보내고'ReadCh'통로를 통해 연결의 정보를 읽고'ShakeHand'를 설정하여 악수 메시지를 보내는지 확인하고Status는 연결 상태를 표시합니다.
WriteLoop을 통해 악수 메시지를 보내고'WriteCh'채널을 감청하여 채널의 메시지를 전달합니다.
//call func with a gorouting, it will send shake hands message to service to make sure self is ok
//if you want to send message call func 'Write', and the case writeCh will be vaild
func (l *Longsocket) WriteLoop() {
defer func() {
if err := recover(); err != nil {
//fmt.Println("writeloop", err)
}
}()
for {
errCount := 0
if l.Status != STATUS_CONNECT {
break
}
select {
case
ReadLoop을 통해 메시지를 받고 메시지를 "ReadCh"채널로 전달합니다.
//read message form socket and write them to readCh
func (l *Longsocket) ReadLoop() {
defer func() {
if err := recover(); err != nil {
//fmt.Println("readloop", err)
}
}()
for {
if l.Status != STATUS_CONNECT {
break
}
buf := make([]byte, l.BufferSize)
n, err := l.Ws.Read(buf)
if err != nil {
break
}
if n > 0 {
l.readCh
그리고 Read 함수를 통해 메시지를 형과 같이 전달할 수 있습니다.
type dealmsg func([]byte, *Longsocket) error
의 함수에서 상응하는 메시지 처리를 할 수 있습니다. 물론 Longsocket 파라미터를 통해 상응하는 처리 메시지를 보낼 수 있습니다.
원본 코드는githup에 아래와 같이 업로드되었습니다.demo가 참고할 수 있습니다.
https://github.com/qianlnk/longsocket