예제 #1
0
        public void Close(bool rightNow = true)
        {
            if (!rightNow)
            {
                // if there are some messages still waiting for sending, delay the closing action
                if (m_OutgoingMessageQueue.Count > 0 || m_IncomingMessageQueue.Count > 0)
                {
                    m_IsGoingToClose = true;
                    return;
                }
            }

            if (m_State > 0)
            {
                // when state is changed from "connected" to "disconnected", fire the event.
                // please note that now the socket is (probably) still connecting and the session is still in group.
                if (m_IoHandler != null)
                {
                    try
                    {
                        m_IoHandler.OnDisconnect(this);
                    }
                    catch { }
                }
            }

            if (m_Stream != null)
            {
                m_State = 0;
                try { m_Stream.Close(); } catch { }
                try { m_Stream.Dispose(); } catch { }
                m_State  = -1;
                m_Stream = null;
            }
            else
            {
                m_State  = -1;
                m_Stream = null;
            }

            try
            {
                // clean up the queue
                if (m_OutgoingMessageQueue.Count > 0)
                {
                    lock (m_OutgoingMessageQueue) m_OutgoingMessageQueue.Clear();
                }

                // clean up the queue
                if (m_IncomingMessageQueue.Count > 0)
                {
                    m_IncomingMessageQueue.Clear(); // incoming data should be processed in single thread
                }

                m_Attributes.Clear();
            }
            catch { }

            m_IsGoingToClose = false;

            if (m_SessionGroup != null)
            {
                // finally, remove it from group ...
                m_SessionGroup.RemoveSession(m_Id);
            }
        }
예제 #2
0
        public void ReceiveIncomingMessages()
        {
            byte             networkError;
            int              connectionId;
            int              channelId;
            int              receivedSize;
            NetworkEventType networkEvent;

            if (HostId >= 0 && NetworkEventHandler != null)
            {
                do
                {
                    networkEvent = NetworkTransport.ReceiveFromHost(HostId, out connectionId, out channelId, NetBuffer.InternalBuffer, NetBuffer.InternalBuffer.Length, out receivedSize, out networkError);
                    switch (networkEvent)
                    {
                    case NetworkEventType.ConnectEvent:
                        if ((NetworkError)networkError == NetworkError.Ok)
                        {
                            if (Mode == OnlineSessionMode.Server)
                            {
                                ClientConnections.Add(new ClientConnection(connectionId));
                            }
                            else if (Mode == OnlineSessionMode.Client)
                            {
                                ServerConnection = connectionId;
                            }
                            NetworkEventHandler.OnConnect(connectionId);
                        }
                        break;

                    case NetworkEventType.DisconnectEvent:
                        if (Mode == OnlineSessionMode.Server)
                        {
                            for (int i = ClientConnections.Count - 1; i >= 0; i--)
                            {
                                if (ClientConnections[i].ConnectionId == connectionId)
                                {
                                    ClientConnections.RemoveAt(i);
                                    break;
                                }
                            }
                        }
                        else if (Mode == OnlineSessionMode.Client)
                        {
                            ServerConnection = -1;
                        }

                        NetworkEventHandler.OnDisconnect(connectionId);

                        if (Mode == OnlineSessionMode.Client)
                        {
                            TerminateNetworking();
                        }
                        break;

                    case NetworkEventType.DataEvent:
                        if ((NetworkError)networkError == NetworkError.Ok)
                        {
                            NetworkEventHandler.OnData(connectionId, channelId, receivedSize);
                        }
                        break;
                    }
                }while (networkEvent != NetworkEventType.Nothing);
            }
        }