/// <summary> /// Метод вызываемый при завершении попытки поключения клиента /// </summary> public void ConnectCallback(IAsyncResult ar) { var result = "Подключение успешно!"; try { // Получаем подключенного клиента TcpClientData myTcpClient = (TcpClientData)ar.AsyncState; NetworkStream ns = myTcpClient.TcpClient.GetStream(); myTcpClient.TcpClient.EndConnect(ar); // Запускаем асинхронный метод чтения сетевых данных для подключенного TCP клиента myTcpClient.Buffer = new byte[Global.Lengthheader]; ns.BeginRead(myTcpClient.Buffer, 0, myTcpClient.Buffer.Length, ReadCallback, myTcpClient); //Parent.ChangeBackColor(Color.Goldenrod); } catch (Exception) { //MessageBox.Show(e.Message); // Обработка ошибок подключения DisconnectClient(); result = "Подключение провалено!"; SoundError(); } // Активация события успешного или неуспешного подключения к серверу, // здесь серверу можно отослать ознакомительные данные о себе (например, имя клиента) if (Connected != null) { Connected.BeginInvoke(this, result, null, null); } }
/// <summary> /// Завершение работы подключенного клиента /// </summary> private static void DeleteClient(TcpClientData mtc) { if (mtc == null || mtc.TcpClient.Connected != true) { return; } mtc.TcpClient.GetStream().Close(); // по настоянию MSDN закрываем поток отдельно у клиента mtc.TcpClient.Close(); // затем закрываем самого клиента }
/// <summary> /// Обратный метод завершения принятия клиентов /// </summary> public void AcceptCallback(IAsyncResult ar) { if (ModeNetwork == Mode.Indeterminately) { return; } var listener = (TcpListener)ar.AsyncState; try { _tcpClient = new TcpClientData { TcpClient = listener.EndAcceptTcpClient(ar) }; // Немедленно запускаем асинхронный метод извлечения сетевых данных // для акцептированного TCP клиента var ns = _tcpClient.TcpClient.GetStream(); _tcpClient.Buffer = new byte[Global.Lengthheader]; ns.BeginRead(_tcpClient.Buffer, 0, _tcpClient.Buffer.Length, ReadCallback, _tcpClient); // Продолжаем ждать запросы на подключение listener.BeginAcceptTcpClient(AcceptCallback, listener); // Активация события успешного подключения клиента if (Accept != null) { Accept.BeginInvoke(this, null, null); } } catch { // Обработка исключительных ошибок возникших при акцептирования клиента. SoundError(); } }
/// <summary> /// Попытка асинхронного подключения клиента к серверу /// </summary> /// <param name="ipserver">IP адрес сервера</param> /// <param name="port">Порт сервера</param> public void ConnectClient(string ipserver, int port) { try { if (ModeNetwork == Mode.Indeterminately) { _tcpClient = new TcpClientData(); _tcpClient.TcpClient.BeginConnect(IPAddress.Parse(ipserver), port, ConnectCallback, _tcpClient); ModeNetwork = Mode.Client; } else { SoundError(); } } catch (Exception e) { if (ShowStatusMessage != null) { ShowStatusMessage(e.Message); } } }