Exemplo n.º 1
0
// 获取有效的消息
// 返回值:
// 消息对应客户端的唯一标识
// 消息内容
// 是否含有有效数据
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
}
Exemplo n.º 2
0
// 获取有效的消息
// 返回值:消息内容
//		:是否含有有效数据
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
}
Exemplo n.º 3
0
// 判断当前已经收到的消息是否为有效消息(即已经收到了完整的信息)
// 返回值:是否有效
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
}
Exemplo n.º 4
0
// 获取有效的消息
// 返回值:
// 消息
//是否含有有效数据
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
}