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); } } }
private void StopSender() { TCPMessageSender s = Interlocked.Exchange(ref this.m_Sender, null); if (s != null) { s.Dispose(); } }
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); }
/// <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); } } } }
/// <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> /// 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); } }