// 获取有效的消息 // 返回值: // 消息对应客户端的唯一标识 // 消息内容 // 是否含有有效数据 func (c *Client) GetValieMessage() (int, []byte, bool) { // 判断是否包含头部信息 if len(c.content) < HEADER_LENGTH { return 0, nil, false } // 获取头部信息 header := c.content[:HEADER_LENGTH] // 将头部数据转换为内部的长度 contentLength := intAndBytesUtil.BytesToInt32(header, byterOrder) // 判断长度是否满足 if len(c.content)-HEADER_LENGTH < int(contentLength) { return 0, nil, false } // 提取消息内容 content := c.content[HEADER_LENGTH : HEADER_LENGTH+contentLength] // 将对应的数据截断,以得到新的数据 c.content = c.content[HEADER_LENGTH+contentLength:] // 截取内容的前4位 idBytes, content := content[:ID_LENGTH], content[ID_LENGTH:] // 提取id id := intAndBytesUtil.BytesToInt32(idBytes, byterOrder) return int(id), content, true }
// 获取有效的消息 // 返回值:消息内容 // :是否含有有效数据 func (c *Client) GetValidMessage() ([]byte, bool) { // 判断是否包含头部信息 if len(c.content) < HEADER_LENGTH { return nil, false } // 获取头部信息 header := c.content[:HEADER_LENGTH] // 将头部数据转换为内部的长度 contentLength := intAndBytesUtil.BytesToInt32(header, byterOrder) // 判断长度是否满足 if len(c.content)-HEADER_LENGTH < int(contentLength) { return nil, false } // 提取消息内容 content := c.content[HEADER_LENGTH : HEADER_LENGTH+contentLength] // 将对应的数据截断,以得到新的数据 c.content = c.content[HEADER_LENGTH+contentLength:] return content, true }
// 判断当前已经收到的消息是否为有效消息(即已经收到了完整的信息) // 返回值:是否有效 func (c *Client) ifHasValidMessage() bool { // 锁住对象 c.mutex.RLock() defer c.mutex.RUnlock() // 判断是否包含头部信息 if len(c.content) < HEADER_LENGTH { return false } // 获取头部信息 header := c.content[:HEADER_LENGTH] // 将头部数据转换为内部的长度 contentLength := intAndBytesUtil.BytesToInt32(header, BYTE_ORDER) // 判断长度是否满足 if len(c.content)-HEADER_LENGTH < int(contentLength) { return false } return true }
// 获取有效的消息 // 返回值: // 消息 //是否含有有效数据 func (c *Client) GetValieMessage() ([]byte, bool) { // 判断是否存在有效的消息 if c.ifHasValidMessage() == false { return nil, false } // 锁住对象 c.mutex.Lock() defer c.mutex.Unlock() // 获取头部信息 header := c.content[:HEADER_LENGTH] // 将头部数据转换为内部的长度 contentLength := intAndBytesUtil.BytesToInt32(header, BYTE_ORDER) // 提取消息内容 content := c.content[HEADER_LENGTH : HEADER_LENGTH+contentLength] // 将对应的数据截断 c.content = c.content[HEADER_LENGTH+contentLength:] return content, true }