public static UnPackageObject UnPackage(byte[] totalBuffer) { UnPackageObject unPackageObject = new UnPackageObject(); //读取消息总长 byte[] totalLengthBytes = new byte[4]; Array.Copy(totalBuffer, 0, totalLengthBytes, 0, 4); uint totalLength = ByteConvert.Bytes2UInt(totalLengthBytes); unPackageObject.totalLength = totalLength; //读取话题 byte[] topicBytes = new byte[4]; Array.Copy(totalBuffer, 4, topicBytes, 0, 4); unPackageObject.ope = (MsgOperation)ByteConvert.Bytes2UInt(topicBytes); //读取消息ID byte[] msgIdBytes = new byte[4]; Array.Copy(totalBuffer, 8, msgIdBytes, 0, 4); unPackageObject.msgId = ByteConvert.Bytes2UInt(msgIdBytes); //读取消息体 byte[] bodyBytes = new byte[totalLength - 12]; Array.Copy(totalBuffer, 12, bodyBytes, 0, totalLength - 12); unPackageObject.body = ByteConvert.ByteToObj(bodyBytes, bodyBytes.Length); return(unPackageObject); }
/// <summary> /// 接完到完整消息后处理消息 /// </summary> /// <param name="state"></param> private void Handle(StateObject state) { UnPackageObject unPackageObject = MQPackageHelper.UnPackage(state.totalBuffer); OperateObject obj = new OperateObject(); obj.ope = unPackageObject.ope; obj.body = unPackageObject.body; obj.workSocket = state.workSocket; //加入队列 taskQueue.Enqueue(obj); BaseMsgObject baseMsgObject = new BaseMsgObject(); baseMsgObject.msgId = unPackageObject.msgId; baseMsgObject.code = 10000; baseMsgObject.message = $"已成功收到[{state.workSocket.RemoteEndPoint.ToString()}][{obj.ope.ToString()}]消息"; Send(state.workSocket, baseMsgObject, MsgOperation.回复消息); }
private void ReceiveCallback(IAsyncResult ar) { try { // Retrieve the state object and the client socket // from the asynchronous state object. StateObject state = (StateObject)ar.AsyncState; Socket client = state.workSocket; // Read data from the remote device. int bytesRead = client.EndReceive(ar); Console.WriteLine($"[{client.LocalEndPoint.ToString()}]接收到[{bytesRead}]字节数据"); if (bytesRead > 0) { //不管是不是第一次接收,只要接收字节总长度小于4 if (state.readBufferLength + bytesRead < 4) { Array.Copy(state.buffer, 0, state.totalBuffer, state.readBufferLength, bytesRead); state.readBufferLength += bytesRead; //继续接收 state.buffer = new byte[StateObject.BufferSize]; client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); return; } //已读长度如果小于4 要先获取总的消息长度 if (state.readBufferLength < 4) { //先拼出消息体长度 byte[] totalLengthBytes = new byte[4]; if (state.readBufferLength > 0) { Array.Copy(state.totalBuffer, 0, totalLengthBytes, 0, state.readBufferLength); } int readLength = 4 - state.readBufferLength; Array.Copy(state.buffer, 0, totalLengthBytes, state.readBufferLength, readLength); state.totalLength = ByteConvert.Bytes2UInt(totalLengthBytes); state.totalBuffer = new byte[state.totalLength]; } //还是没读完 if (state.totalLength > state.readBufferLength + bytesRead) { Array.Copy(state.buffer, 0, state.totalBuffer, state.readBufferLength, bytesRead); state.readBufferLength += bytesRead; //继续接收 state.buffer = new byte[StateObject.BufferSize]; client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); return; } //已经够读完了 Array.Copy(state.buffer, 0, state.totalBuffer, state.readBufferLength, state.totalLength - state.readBufferLength); Console.WriteLine($"[{client.LocalEndPoint.ToString()}]接收包总长度[{state.totalLength}]字节数据"); UnPackageObject unPackageObject = MQPackageHelper.UnPackage(state.totalBuffer); //接收成功事件不为null时触发 if (msgReceiveEvent != null) { Task.Run(() => { msgReceiveEvent(unPackageObject); }); } //接收完完整的一个包,休息200毫秒 间隔太短可能导致实体类的值被覆盖 Thread.Sleep(200); //继续接收这个客户端发来的下一个消息 StateObject nextState = new StateObject(); nextState.workSocket = client; //当超出当前接收内容时触发 if (state.readBufferLength + bytesRead > state.totalLength) { //这里说明一个完整的消息体接收完了,有可能还会读到下一次的消息体 byte[] newTotalBuffer = new byte[state.readBufferLength + bytesRead - state.totalLength]; Array.Copy(state.buffer, state.totalLength - state.readBufferLength, newTotalBuffer, 0, state.readBufferLength + bytesRead - state.totalLength); //要重新建一个对象,不然会影响到异步执行后续处理方法 nextState.readBufferLength = newTotalBuffer.Length; if (nextState.readBufferLength >= 4) { //拼出消息体长度 byte[] totalLengthBytes = new byte[4]; Array.Copy(newTotalBuffer, 0, totalLengthBytes, 0, 4); nextState.totalLength = ByteConvert.Bytes2UInt(totalLengthBytes); nextState.totalBuffer = new byte[nextState.totalLength]; } Array.Copy(newTotalBuffer, 0, nextState.totalBuffer, 0, nextState.readBufferLength); } client.BeginReceive(nextState.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), nextState); receiveDone.Set(); } } catch (Exception e) { Console.WriteLine(e.ToString()); } }
void Handle(UnPackageObject obj) { string result = JsonConvert.SerializeObject(obj.body); Console.WriteLine(obj.ope.ToString() + ":" + result); }