public static void MainLoop() { if (null == JClientSocket.socket) { JLog.Error("JClientDataReceiverThread.MainLoop JClientSocket.socket is null, please make sure JClientSocketManager is initialized. ", JGame.Log.JLogCategory.Network); return; } while (true) { if (_requireEnd) { break; } if (JClientSocket.socket.Available <= 0) { Thread.Sleep(100); continue; } byte[] buffer = new byte[JTcpDefines.max_buffer_size]; int recLen = JClientSocket.socket.Receive(buffer); if (recLen > 0) { JNetworkDataOperator.ReceiveData(recLen, buffer, JClientSocket.socket.RemoteEndPoint); } else { //说明socket已经断开连接 } } }
private void ReceiveLoop() { JLog.Info("JServerSocketManager server receive loop started", JGame.Log.JLogCategory.Network); List <Socket> clientScokets = new List <Socket> (); while (true) { if (_forceEnd) { break; } if (_semaphore.WaitOne(1)) { _semaphore = new Semaphore(0, 10000); JLog.Info("JServerSocketManager ReceiveLoop _semaphore.WaitOne(1) success", JGame.Log.JLogCategory.Network); lock (_socketLocker) { foreach (Socket socket in JConnectedClientSocket.sockets) { clientScokets.Add(socket); } JLog.Info("JServerSocketManager ReceiveLoop add socket to clientsockets: count : " + clientScokets.Count.ToString(), JGame.Log.JLogCategory.Network); } JLog.Debug("connected client sockets : " + clientScokets.Count.ToString(), JGame.Log.JLogCategory.Network); } if (clientScokets.Count == 0) { _semaphore.WaitOne(); _semaphore.Release(); JLog.Debug("JServerSocketManager ReceiveLoop._semaphore.WaitOne success. ", JGame.Log.JLogCategory.Network); continue; } //JLog.Debug ("JServerSocketManager ReceiveLoop.Socket.Select begin Socket.Select clientsocket:count :" + clientScokets.Count.ToString (), JGame.Log.JLogCategory.Network); Socket.Select(clientScokets, null, null, 10000); if (clientScokets.Count > 0) { JLog.Debug("JServerSocketManager ReceiveLoop.Socket.Select selected clientsockets: count : " + clientScokets.Count.ToString(), JGame.Log.JLogCategory.Network); } List <Socket> disconnectedSockets = new List <Socket>(); foreach (Socket socket in clientScokets) { /*if (socket.Available <= 0) * continue;*/ //如果接收到了新的消息就重置包时间 lock (_heartbeatLocker) { if (_socketHeartDelayTime.ContainsKey(socket)) { _socketHeartDelayTime [socket] = JTime.CurrentTime; } else { _socketHeartDelayTime.Add(socket, JTime.CurrentTime); } } //receive form client socket bool bReceivedSuccess = false; if (socket.Connected) { try { byte[] recBuffer = new byte[JTcpDefines.max_buffer_size]; JLog.Info("try to receive from socket : " + (socket.RemoteEndPoint as IPEndPoint).Address.ToString(), JGame.Log.JLogCategory.Network); int recLen = socket.Receive(recBuffer); if (recLen > 0) { JLog.Info("receive one packet from client : IP" + (socket.RemoteEndPoint as IPEndPoint).Address.ToString() + " len:" + recLen.ToString(), JGame.Log.JLogCategory.Network); //save the received data JNetworkDataOperator.ReceiveData(recLen, recBuffer, socket.RemoteEndPoint); //add the selected socket to select sockets list //clientScokets.Add(socket); bReceivedSuccess = true; } } catch (Exception e) { JLog.Error("JServerSocketManager ReceiveLoop exception reveive error message:" + e.Message, JGame.Log.JLogCategory.Network); } } try { if (!bReceivedSuccess) { //client disconnect if (socket.Connected) { socket.Close(); } //record disconnected socket from list disconnectedSockets.Add(socket); JLog.Info("client socket disconnected : " + socket.RemoteEndPoint.ToString(), JGame.Log.JLogCategory.Network); } } catch (Exception e) { JLog.Error("JServerSocketManager ReceiveLoop exception error message1:" + e.Message, JGame.Log.JLogCategory.Network); } } try { //remove disconnected socket form list if (disconnectedSockets.Count > 0) { lock (_socketLocker) { foreach (Socket socket in disconnectedSockets) { JConnectedClientSocket.sockets.Remove(socket); clientScokets.Remove(socket); } } } //add old sockets to client sockets lock (_socketLocker) { foreach (Socket socket in JConnectedClientSocket.sockets) { clientScokets.Add(socket); } } } catch (Exception e) { JLog.Error("JServerSocketManager ReceiveLoop exception error message2:" + e.Message, JGame.Log.JLogCategory.Network); } } JLog.Info("JServerSocketManager server receive loop end.", JGame.Log.JLogCategory.Network); }