// Непосредственно разрыв private void DisableConnect() { ChannelServices.UnregisterChannel(ChannelServices.RegisteredChannels[0]); try { if (m_RefFromClient != null) { RemotingServices.Unmarshal(m_RefFromClient); RemotingServices.Disconnect(m_FromClient); } } // ReSharper disable EmptyGeneralCatchClause catch { } // ReSharper restore EmptyGeneralCatchClause try { if (m_RefFromServer != null) { RemotingServices.Unmarshal(m_RefFromServer); RemotingServices.Disconnect(m_FromServer); } } // ReSharper disable EmptyGeneralCatchClause catch { } // ReSharper restore EmptyGeneralCatchClause m_TypePlayer = TypePlayer.Local; serverButton.Visible = connectButton.Visible = true; disconnectButton.Visible = false; m_FromClient = null; m_FromServer = null; startGameButton.Enabled = true; m_WhoStep = ObjectType.Empty; m_ClientReady = m_ServerReady = false; textBoxNetInfo.Text += "Соединение разорвано."; }
// Подключиться к серверу private void connectButton_Click(object sender, EventArgs e) { try { m_ClientReady = m_ServerReady = false; new ServerConnectForm(this).ShowDialog(); if (IpConnect != "") { ChannelServices.RegisterChannel(new TcpChannel(8081), false); m_FromClient = (FromClientTransmittor)Activator.GetObject(typeof(FromClientTransmittor), "tcp://" + IpConnect + ":8080/FromClientTransmittor"); // Установить свой сервер для получения ответа от сервера m_FromServer = new FromServerTransmittor(); m_RefFromServer = RemotingServices.Marshal(m_FromServer, "FromServerTransmittor"); // Обработка события на запрос о ничьей m_FromServer.ToClientRemiEvent += ToClientRemiEvent; // Обработка события на сообщение о сдаче сервера m_FromServer.ToClientDeliverEvent += ToClientDeliverEvent; // Обработка очередного хода сервера m_FromServer.ToClientStepEvent += ToClientStepEvent; // Обработка события на готовность клиента играть m_FromServer.ToClientReadyEvent += ToClientReadyEvent; // Обработка события на отключение клиента m_FromServer.ToClientDisableEvent += ToClientDisableEvent; // Получение сетевого адреса клиента (вида tcp://xxx.xxx.xxx.xxx:8081) IPAddress ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList[Dns.GetHostEntry(Dns.GetHostName()).AddressList.Length - 1]; string addr = "tcp://" + ip + ":8081"; var cb = new AsyncCallback(StartGameQuery); var d = new StartGameDelegate(m_FromClient.StartGame); d.BeginInvoke(addr, cb, null); m_WhoStep = ObjectType.Cross; m_TypePlayer = TypePlayer.Client; serverButton.Visible = connectButton.Visible = false; disconnectButton.Visible = true; textBoxNetInfo.Text = "Соединение с сервером установлено\r\n"; } } catch { MessageBox.Show("Подключение к серверу не установлено.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); ChannelServices.UnregisterChannel(ChannelServices.RegisteredChannels[0]); try { if (m_RefFromClient != null) { RemotingServices.Unmarshal(m_RefFromClient); RemotingServices.Disconnect(m_FromClient); } } // ReSharper disable EmptyGeneralCatchClause catch { } // ReSharper restore EmptyGeneralCatchClause try { if (m_RefFromServer != null) { RemotingServices.Unmarshal(m_RefFromServer); RemotingServices.Disconnect(m_FromServer); } } // ReSharper disable EmptyGeneralCatchClause catch { } // ReSharper restore EmptyGeneralCatchClause } }
// Установить сервер private void serverButton_Click(object sender, EventArgs e) { try { textBoxNetInfo.Text = ""; m_ClientReady = m_ServerReady = false; ChannelServices.RegisterChannel(new TcpChannel(8080), false); m_FromClient = new FromClientTransmittor(); m_RefFromClient = RemotingServices.Marshal(m_FromClient, "FromClientTransmittor"); // Обработка события на запрос о ничьей m_FromClient.ToServerRemiEvent += ToServerRemiEvent; // Обработка события на сообщение о начале игры m_FromClient.StartGameEvent += StartGameEvent; // Обработка нового хода клиента m_FromClient.ToServerStepEvent += ToServerStepEvent; // Обработка события на сообщение о ничьей m_FromClient.ToServerDeliverEvent += ToServerDeliverEvent; // Обработка события на готовность клиента играть m_FromClient.ToServerReadyEvent += ToServerReadyEvent; // Обработка события на отключение клиента m_FromClient.ToServerDisableEvent += ToServerDisableEvent; m_WhoStep = ObjectType.Cross; m_TypePlayer = TypePlayer.Server; IPAddress ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList[Dns.GetHostEntry(Dns.GetHostName()).AddressList.Length - 1]; textBoxNetInfo.Text += "Сервер установлен\r\nIP-адрес: " + ip + "\r\n"; textBoxNetInfo.Text += "Ожидаем подсоединения клиента\r\n"; serverButton.Visible = connectButton.Visible = startGameButton.Enabled = false; disconnectButton.Visible = true; } catch { MessageBox.Show("Сервер не установлен.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); try { ChannelServices.UnregisterChannel(ChannelServices.RegisteredChannels[0]); } // ReSharper disable EmptyGeneralCatchClause catch { } // ReSharper restore EmptyGeneralCatchClause try { if (m_RefFromClient != null) { RemotingServices.Unmarshal(m_RefFromClient); RemotingServices.Disconnect(m_FromClient); } } // ReSharper disable EmptyGeneralCatchClause catch { } // ReSharper restore EmptyGeneralCatchClause try { if (m_RefFromServer != null) { RemotingServices.Unmarshal(m_RefFromServer); RemotingServices.Disconnect(m_FromServer); } } // ReSharper disable EmptyGeneralCatchClause catch { } // ReSharper restore EmptyGeneralCatchClause } }