private void AddClient(SocketEventParam socketParam) { lock (_clientGroup) { _clientGroup[socketParam.Socket] = socketParam; } }
/// <summary> /// 作为客户端连接后要对AsyncSocketClient的处理--事件方法 /// </summary> /// <param name="param"></param> /// <param name="client"></param> private void SocketConnectEvent(SocketEventParam param, AsyncSocketClient client) { try { if (param.Socket == null || client == null) //连接失败 { } else { lock (_clientGroup) { _clientGroup[client.ConnectSocket] = client; } client.OnSocketClose += Client_OnSocketClose; client.OnReadData += Client_OnReadData; client.OnSendData += Client_OnSendData; _listReadEvent.PutObj(new SocketEventDeal(client, EN_SocketDealEvent.read)); } _socketEventPool.PutObj(param); } catch (Exception ex) { NetLogger.Log($"SocketConnectEvent 异常 {ex.Message}***", ex); } }
/// <summary> /// 对数据的打包处理 /// </summary> private void DealEventPool() { while (true) { SocketEventParam param = _socketEventPool.GetObj(); if (param == null) { break; } if (param.SocketEvent == EN_SocketEvent.close) { var aa = _clientGroup.TryRemove(param.Socket, out _); if (!aa) { Console.WriteLine("_clientGroup TryRemove False"); } } //if (PacketMinLen == 0) //字节流处理 //{ OnSocketPacketEvent?.Invoke(param); //} } }
/// <summary> /// 对读取到的数据进行处理--Client异步读取完后会执行这个事件方法 /// </summary> /// <param name="client">当前客户端类</param> /// <param name="readData">读取到的数据</param> private void Client_OnReadData(AsyncSocketClient client, byte[] readData, int offset, int count) { _listReadEvent.PutObj(new SocketEventDeal(client, EN_SocketDealEvent.read)); //读下一条 try { var param = new SocketEventParam(client.ConnectSocket, EN_SocketEvent.read) { ClientInfo = client.ClientInfo, Data = readData, Offset = offset, Count = count }; if (client.ConnectSocket.Connected) { _socketEventPool.PutObj(param); lock (this) { ReadByteCount += readData.Length; } } } catch (Exception ex) { NetLogger.Log($@"Client_OnReadData 异常 {ex.Message}***{ex.StackTrace}"); } }
/// <summary> /// Listener 生成的 AsyncSocketClient 回调方法 /// </summary> /// <param name="listenParam">客户端参数</param> /// <param name="client">生成的客户端 实体类</param> private void Listener_OnAcceptSocketClient(ListenParam listenParam, AsyncSocketClient client) { try { lock (_clientGroup) { _clientGroup[client.ConnectSocket] = client; } //给Client添加消息处理事件 client.OnSocketClose += Client_OnSocketClose; client.OnReadData += Client_OnReadData; client.OnSendData += Client_OnSendData; client.OnSocketHeart += Client_OnSocketHeart; _listReadEvent.PutObj(new SocketEventDeal(client, EN_SocketDealEvent.read)); var param = new SocketEventParam(client.ConnectSocket, EN_SocketEvent.accept) { ClientInfo = client.ClientInfo }; _socketEventPool.PutObj(param); } catch (Exception ex) { NetLogger.Log(@"Listener_OnAcceptSocket 异常", ex); } }
private void RemoveClient(SocketEventParam socketParam) { lock (_clientGroup) { var remove = _clientGroup.Remove(socketParam.Socket); if (!remove) { Console.WriteLine($"移除{socketParam.ClientInfo.PeerRemoteEndPoint} 失败"); } } }
private void Client_OnSocketClose(AsyncSocketClient client) { try { SocketEventParam param = new SocketEventParam(client.ConnectSocket, EN_SocketEvent.close); param.ClientInfo = client.ClientInfo; //Console.WriteLine("放入关闭命令"); _socketEventPool.PutObj(param); } catch (Exception ex) { NetLogger.Log($"Client_OnSocketClose 异常 {ex.Message}***", ex); } }
/// <summary> /// 收到最终的字节流 事件方法 /// </summary> /// <param name="socketParam"></param> private void SocketPacketDeal(SocketEventParam socketParam) { string peerIp = socketParam.ClientInfo.PeerRemoteEndPoint; switch (socketParam.SocketEvent) { case EN_SocketEvent.accept: { AddClient(socketParam); NetLogger.Log($@"客户端链接!本地端口:{socketParam.ClientInfo.LocalPort},对端:{peerIp},客户端数量:{ClientCount}"); break; } case EN_SocketEvent.close: { RemoveClient(socketParam); NetLogger.Log($@"客户端断开!本地端口:{socketParam.ClientInfo.LocalPort},对端:{peerIp},剩余客户端数量:{ClientCount}"); break; } case EN_SocketEvent.read: { var data = new byte[socketParam.Count]; Array.Copy(socketParam.Data, 0, data, 0, socketParam.Count); OnSocketReceive?.Invoke(socketParam.Socket, data); break; } case EN_SocketEvent.connect: { if (socketParam.Socket != null) { AddClient(socketParam); NetLogger.Log($@"连接对端成功!本地端口:{socketParam.ClientInfo.LocalPort},对端:{peerIp},客户端数量:{ClientCount}"); } else { NetLogger.Log($@"连接对端失败!本地端口:{socketParam.ClientInfo.LocalPort},对端:{peerIp},客户端数量:{ClientCount}"); } break; } } //SocketEventParamPool.Instance.PushSocketEventDeal(socketParam); }
/// <summary> /// package中添加的事件方法 /// </summary> /// <param name="param"></param> public void PutClientPacket(SocketEventParam param) { OnSocketPacketEvent?.Invoke(param); }
public void PutSocketParam(SocketEventParam param) { throw new NotImplementedException(); }