public void ConnectCallback(IAsyncResult ar) { string 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, new AsyncCallback(ReadCallback), myTcpClient); } catch (Exception e) { //MessageBox.Show(e.Message); // Обработка ошибок подключения DisconnectClient(); result = "Подключение провалено!"; SoundError(); } // Активация события успешного или неуспешного подключения к серверу, // здесь серверу можно отослать ознакомительные данные о себе (например, имя клиента) if (Connected != null) { Connected.BeginInvoke(this, result, null, null); } }
public void AcceptCallback(IAsyncResult ar) { if (modeNetwork == Mode.indeterminately) { return; } TcpListener listener = (TcpListener)ar.AsyncState; try { _tcpClient = new TcpClientData(); _tcpClient.tcpClient = listener.EndAcceptTcpClient(ar); NetworkStream ns = _tcpClient.tcpClient.GetStream(); _tcpClient.buffer = new byte[Global.LENGTHHEADER]; ns.BeginRead(_tcpClient.buffer, 0, _tcpClient.buffer.Length, new AsyncCallback(ReadCallback), _tcpClient); listener.BeginAcceptTcpClient(AcceptCallback, listener); if (Accept != null) { Accept.BeginInvoke(this, null, null); } } catch { // Обработка исключительных ошибок возникших при акцептирования клиента. SoundError(); } }
/// <summary> /// Завершение работы подключенного клиента /// </summary> private void DeleteClient(TcpClientData mtc) { if (mtc != null && mtc.tcpClient.Connected == true) { mtc.tcpClient.GetStream().Close(); // по настоянию MSDN закрываем поток отдельно у клиента mtc.tcpClient.Close(); // затем закрываем самого клиента } }
/// <summary> /// Попытка асинхронного подключения клиента к серверу /// </summary> /// <param name="ipserver">IP адрес сервера</param> public void ConnectClient(string ipserver) { if (modeNetwork == Mode.indeterminately) { _tcpClient = new TcpClientData(); _tcpClient.tcpClient.BeginConnect(IPAddress.Parse(ipserver), 15000, new AsyncCallback(ConnectCallback), _tcpClient); modeNetwork = Mode.Client; } else { SoundError(); } }
/// <summary> /// Метод асинхронно вызываемый при наличие данных в буферах приема. /// </summary> public void ReadCallback(IAsyncResult ar) { if (modeNetwork == Mode.indeterminately) { return; } TcpClientData myTcpClient = (TcpClientData)ar.AsyncState; try { NetworkStream ns = myTcpClient.tcpClient.GetStream(); int r = ns.EndRead(ar); if (r > 0) { string header = Encoding.Default.GetString(myTcpClient.buffer); int leninfo = int.Parse(header); MemoryStream ms = new MemoryStream(leninfo); byte[] temp = new byte[leninfo]; r = ns.Read(temp, 0, temp.Length); ms.Write(temp, 0, r); BinaryFormatter bf = new BinaryFormatter(); ms.Position = 0; SendInfo sc = (SendInfo)bf.Deserialize(ms); ms.Close(); if (sc.filesize > 0) { FileStream fs = new FileStream(sc.filename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, sc.filesize); do { temp = new byte[Global.MAXBUFFER]; r = ns.Read(temp, 0, temp.Length); fs.Write(temp, 0, r); if (fs.Length == sc.filesize) { fs.Close(); fs = null; break; } }while (r > 0); temp = null; GC.Collect(); GC.WaitForPendingFinalizers(); } Receive?.Invoke(this, new ReceiveEventArgs(sc)); myTcpClient.buffer = new byte[Global.LENGTHHEADER]; ns.BeginRead(myTcpClient.buffer, 0, myTcpClient.buffer.Length, new AsyncCallback(ReadCallback), myTcpClient); } else { DeleteClient(myTcpClient); if (Disconnected != null) { Disconnected.BeginInvoke(this, "Клиент отключился!", null, null); } } } catch (Exception e) { DeleteClient(myTcpClient); // Событие клиент отключился if (Disconnected != null) { Disconnected.BeginInvoke(this, "Клиент отключился аварийно!", null, null); } SoundError(); } }