Пример #1
0
        private void HandleClientConnectedChanged(object sender, PropertyEventArgs args)
        {
            TCPClient client = (TCPClient)sender;

            if (args is PropertyChangeEventArgs)
            {
                if ((bool)((PropertyChangeEventArgs)args).NewValue == true)
                {
                    using (Synchronizer.Lock(this.SyncRoot))
                        this.SetPublishedProperty("ClientConnected", ref m_ClientConnected, true);
                    if (m_Sender == null)
                    {
                        m_Sender = new TCPMessageSender(client, this.m_Model, this.m_Classroom);
                        Trace.WriteLine("Client Connection Handler Started TCPMessageSender.", this.GetType().ToString());
                    }
                    else
                    {
                        SendRoleAndGroupMessage(m_Sender);
                    }
                }
                else
                {
                    using (Synchronizer.Lock(this.SyncRoot))
                        this.SetPublishedProperty("ClientConnected", ref m_ClientConnected, false);
                }
            }
        }
Пример #2
0
        private void StopSender()
        {
            TCPMessageSender s = Interlocked.Exchange(ref this.m_Sender, null);

            if (s != null)
            {
                s.Dispose();
            }
        }
Пример #3
0
        private void StartServer(InstructorModel instructor)
        {
            if (m_Server != null)
            {
                Trace.WriteLine("Attempt to start a TCPServer when a server is already running.", this.GetType().ToString());
                return;

                //throw (new ApplicationException("Attempt to start a TCPServer when a server is already running."));
            }

            m_Server = new TCPServer(this.m_Model, this.m_Classroom, instructor);
            m_Sender = new TCPMessageSender(m_Server, this.m_Model, this.m_Classroom);
            m_Server.Start(m_Sender);
            m_Receiver = new TCPMessageReceiver(m_Server, this.m_Model, this.m_Classroom);
            using (Synchronizer.Lock(this.SyncRoot))
                this.SetPublishedProperty("ServerStarted", ref m_ServerStarted, true);
        }
Пример #4
0
        /// <summary>
        /// If current role is public, then resend RoleMessage and GroupMessage for reconnection
        /// </summary>
        private void SendRoleAndGroupMessage(TCPMessageSender sender)
        {
            using (Synchronizer.Lock(this.m_Model.Participant.SyncRoot)) {
                if (this.m_Model.Participant.Role is PublicModel)
                {
                    //Send RoleMessage
                    UW.ClassroomPresenter.Network.Messages.Message message = RoleMessage.ForRole(this.m_Model.Participant.Role);
                    message.Group = Group.AllParticipant;
                    sender.Send(message);

                    //Send GroupMessage
                    foreach (Group group in this.m_Model.Participant.Groups)
                    {
                        message       = new ParticipantGroupAddedMessage(group);
                        message.Group = Group.AllParticipant;
                        sender.Send(message);
                    }
                }
            }
        }
Пример #5
0
        /// <summary>
        /// Start accepting client connections
        /// </summary>
        /// <param name="sender"></param>
        public void Start(TCPMessageSender sender)
        {
            m_Sender = sender;
            // Open a TcpListener to listen for incoming client connections.
            int standardPort = m_ListenEP.Port;
            for (; ; m_ListenEP.Port++) {
                try {
                    this.m_Listener = new TcpListener(m_ListenEP);
                    this.m_Listener.Start();
                }
                catch (SocketException se) {
                    // If the server was unable to start because another local process
                    // is already using the specified port number, then retry with a
                    // different port.
                    if (se.ErrorCode == 10048)  //10048: Address already in use
                    {
                        Trace.WriteLine("Warning: Server could not start on requested port.  The port is already in use: " + m_ListenEP.Port.ToString(), this.GetType().ToString());
                        continue;
                    }
                    else {
                        Trace.WriteLine("!!!Failed to start TCP Listener: " + se.ToString(), this.GetType().ToString());
                        MessageBox.Show("Unexpected error: Failed to start the TCP Listener.  \r\n" +
                            "Exception text: " + se.ToString(), "Failed to Start Listener", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                }
                catch (Exception e) {
                    Trace.WriteLine("!!!Failed to start TCP Listener: " + e.ToString(), this.GetType().ToString());
                    MessageBox.Show("Unexpected error: Failed to start the TCP Listener.  \r\n" +
                        "Exception text: " + e.ToString(), "Failed to Start Listener", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                Trace.WriteLine("Started TCPListener on " + m_ListenEP.ToString(), this.GetType().ToString());

                //Warn if the port number is not the standard one.
                if (m_ListenEP.Port != standardPort) {
                    MessageBox.Show(Strings.NonStandardMannulConnect + m_ListenEP.Port.ToString(), Strings.UsingNonStandardPort, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                break;
            }

            //A thread to listen for new client connections
            Thread thread = new Thread(new ThreadStart(this.ListenThread));
            thread.Name = "TCPServer.ListenThread: " + m_ListenEP.ToString();
            thread.Start();

            //A thread to clean up resources when clients leave us
            Thread maintenanceThread = new Thread(new ThreadStart(MaintenanceThread));
            maintenanceThread.Name = "TCPServer.MaintenanceThread";
            maintenanceThread.Start();

            //Refresh NetworkStatus
            using (Synchronizer.Lock(this.SyncRoot)) {
                NetworkStatus newStatus = m_NetworkStatus.Clone();
                newStatus.ConnectionStatus = ConnectionStatus.Connected;
                this.SetPublishedProperty("NetworkStatus", ref m_NetworkStatus, newStatus);
            }
        }
 private void HandleClientConnectedChanged(object sender, PropertyEventArgs args)
 {
     TCPClient client = (TCPClient)sender;
     if (args is PropertyChangeEventArgs) {
         if ((bool)((PropertyChangeEventArgs)args).NewValue == true) {
             using (Synchronizer.Lock(this.SyncRoot))
                 this.SetPublishedProperty("ClientConnected", ref m_ClientConnected, true);
             if (m_Sender == null) {
                 m_Sender = new TCPMessageSender(client, this.m_Model, this.m_Classroom);
                 Trace.WriteLine("Client Connection Handler Started TCPMessageSender.", this.GetType().ToString());
             }
             else SendRoleAndGroupMessage(m_Sender);
         }
         else {
             using (Synchronizer.Lock(this.SyncRoot))
                 this.SetPublishedProperty("ClientConnected", ref m_ClientConnected, false);
         }
     }
 }
        /// <summary>
        /// If current role is public, then resend RoleMessage and GroupMessage for reconnection
        /// </summary>
        private void SendRoleAndGroupMessage(TCPMessageSender sender)
        {
            using (Synchronizer.Lock(this.m_Model.Participant.SyncRoot)) {
                if (this.m_Model.Participant.Role is PublicModel) {

                    //Send RoleMessage
                    UW.ClassroomPresenter.Network.Messages.Message message = RoleMessage.ForRole(this.m_Model.Participant.Role);
                    message.Group = Group.AllParticipant;
                    sender.Send(message);

                    //Send GroupMessage
                    foreach (Group group in this.m_Model.Participant.Groups) {
                        message = new ParticipantGroupAddedMessage(group);
                        message.Group = Group.AllParticipant;
                        sender.Send(message);
                    }
                }
            }
        }
Пример #8
0
        private void StartServer(InstructorModel instructor)
        {
            if (m_Server != null) {
                Trace.WriteLine("Attempt to start a TCPServer when a server is already running.", this.GetType().ToString());
                return;

                //throw (new ApplicationException("Attempt to start a TCPServer when a server is already running."));
            }

            m_Server = new TCPServer(this.m_Model, this.m_Classroom, instructor);
            m_Sender = new TCPMessageSender(m_Server, this.m_Model, this.m_Classroom);
            m_Server.Start(m_Sender);
            m_Receiver = new TCPMessageReceiver(m_Server, this.m_Model, this.m_Classroom);
            using (Synchronizer.Lock(this.SyncRoot))
                this.SetPublishedProperty("ServerStarted", ref m_ServerStarted, true);
        }
Пример #9
0
        /// <summary>
        /// Start accepting client connections
        /// </summary>
        /// <param name="sender"></param>
        public void Start(TCPMessageSender sender)
        {
            m_Sender = sender;
            // Open a TcpListener to listen for incoming client connections.
            int standardPort = m_ListenEP.Port;

            for (; ; m_ListenEP.Port++)
            {
                try {
                    this.m_Listener = new TcpListener(m_ListenEP);
                    this.m_Listener.Start();
                }
                catch (SocketException se) {
                    // If the server was unable to start because another local process
                    // is already using the specified port number, then retry with a
                    // different port.
                    if (se.ErrorCode == 10048)  //10048: Address already in use
                    {
                        Trace.WriteLine("Warning: Server could not start on requested port.  The port is already in use: " + m_ListenEP.Port.ToString(), this.GetType().ToString());
                        continue;
                    }
                    else
                    {
                        Trace.WriteLine("!!!Failed to start TCP Listener: " + se.ToString(), this.GetType().ToString());
                        MessageBox.Show("Unexpected error: Failed to start the TCP Listener.  " +
                                        "SocketException ErrorCode=" + se.ErrorCode.ToString() + ". \r\n" +
                                        "Exception text: " + se.ToString(), "Failed to Start Listener", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                }
                catch (Exception e) {
                    Trace.WriteLine("!!!Failed to start TCP Listener: " + e.ToString(), this.GetType().ToString());
                    MessageBox.Show("Unexpected error: Failed to start the TCP Listener.  \r\n" +
                                    "Exception text: " + e.ToString(), "Failed to Start Listener", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                Trace.WriteLine("Started TCPListener on " + m_ListenEP.ToString(), this.GetType().ToString());

                //Warn if the port number is not the standard one.
                if (m_ListenEP.Port != standardPort)
                {
                    MessageBox.Show(Strings.NonStandardMannulConnect + m_ListenEP.Port.ToString(), Strings.UsingNonStandardPort, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                break;
            }

            //A thread to listen for new client connections
            Thread thread = new Thread(new ThreadStart(this.ListenThread));

            thread.Name = "TCPServer.ListenThread: " + m_ListenEP.ToString();
            thread.Start();

            //A thread to clean up resources when clients leave us
            Thread maintenanceThread = new Thread(new ThreadStart(MaintenanceThread));

            maintenanceThread.Name = "TCPServer.MaintenanceThread";
            maintenanceThread.Start();

            //Refresh NetworkStatus
            using (Synchronizer.Lock(this.SyncRoot)) {
                NetworkStatus newStatus = m_NetworkStatus.Clone();
                newStatus.ConnectionStatus = ConnectionStatus.Connected;
                this.SetPublishedProperty("NetworkStatus", ref m_NetworkStatus, newStatus);
            }
        }