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

좋은 웹페이지 즐겨찾기