コード例 #1
0
        /// <summary>
        /// Метод вызываемый при завершении попытки поключения клиента
        /// </summary>
        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);
                Parent.ChangeBackColor(Color.Goldenrod);
            }
            catch (Exception e)
            {
                //MessageBox.Show(e.Message);
                // Обработка ошибок подключения
                DisconnectClient();
                result = "Подключение провалено!";
                SoundError();
            }

            // Активация события успешного или неуспешного подключения к серверу,
            // здесь серверу можно отослать ознакомительные данные о себе (например, имя клиента)
            if (Connected != null)
            {
                Connected.BeginInvoke(this, result, null, null);
            }
        }
コード例 #2
0
ファイル: TCPClient.cs プロジェクト: PsychoTeras/RatKing
        private void ProcessConnect(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                _isConnected = true;

                _clientToken            = new ClientToken(0, e.AcceptSocket, _receiveEvent, _sendEvent);
                _receiveEvent.UserToken = _sendEvent.UserToken = e.UserToken = _clientToken;

                StartReceive(_receiveEvent);

                //Fire Connected event
                if (Connected != null)
                {
                    if (CallConnectedAsync)
                    {
                        Connected.BeginInvoke(this, r => Connected.EndInvoke(r), null);
                    }
                    else
                    {
                        Connected(this);
                    }
                }
            }
            else
            {
                ProcessConnectionError(e);
            }
        }
コード例 #3
0
 /// <summary>
 /// 启动服务器
 /// </summary>
 /// <param name="ServerIP"></param>
 /// <param name="Port"></param>
 /// <returns></returns>
 public Boolean Start()
 {
     try
     {
         //msgQueue = new ConcurrentQueue<byte[]>(); //启动的时候重新初始化队列
         _dataBuffer = new byte[1024 * 100];
         _NoFullPack = string.Empty;
         IPEndPoint iep = new IPEndPoint(IPAddress.Parse(_IPAddress), _Port);
         clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
         clientSocket.Connect(iep);
         clientSocket.BeginReceive(_dataBuffer, 0, _dataBuffer.Length, 0, new AsyncCallback(RecieveCallBack), clientSocket);
         _IsRun = true;
         this.LastConnectTime    = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
         this._LastKeepAliveTime = DateTime.Now;
         Connected?.BeginInvoke("已链接", "1", this, null, null);
         //发送数据线程
         this.SendMessageThread(0);
         //心跳监测线程
         //this.KeepAliveThread(30);
         //心跳超时检测
         //this.KeepAliveTimeoutTestThread();
     }
     catch (Exception ex)
     {
         _IsRun = false;
         //_logger.Error(ex.Message,ex);
         LogManager.Error(ex.Message, ex);
     }
     return(_IsRun);
 }
コード例 #4
0
        /// <summary>
        /// UDP重新连接方法
        /// </summary>
        private void TcpAutoReconnect()
        {
            while (true)
            {
                Thread.Sleep(1000);

                //假如属性提示未连接,则UDP重连线程挂起
                if (!IsConnected)
                {
                    Auto_UdpReconnect.WaitOne();
                }
                //假如属性提示已连接但实际上连接已断开,尝试重连
                //else if (IsConnected && !IsSocketConnected())
                else if (IsConnected && !IsConnected_Socket)
                {
                    string temp = string.Format("UDP主机地址:{0},端口号:{1}", ServerIp, ServerPort); //UDP连接的主机地址与端口
                    LastErrorMessage = "UDP连接意外断开,正在尝试重连。" + temp;
                    FileClient.WriteFailureInfo(LastErrorMessage);
                    try
                    {
                        BaseClient.Close();
                        BaseClient = HoldLocalPort ? new UdpClient(LocalEndPoint) : new UdpClient();
                        BaseClient.Connect(ServerIp, ServerPort);
                        SetName();

                        //重连次数+1,同时调用事件委托
                        ReconnTimer++;
                        if (ReconnTimerChanged != null)
                        {
                            ReconnTimerChanged.BeginInvoke(Name, ReconnTimer, null, null);
                        }
                        if (Connected != null)
                        {
                            Connected.BeginInvoke(Name, new EventArgs(), null, null);
                        }

                        //NetStream = BaseClient.GetStream();
                        if (AutoReceive)
                        {
                            BaseClient.BeginReceive(new AsyncCallback(ReceiveCallBack), this);
                        }
                        //NetStream.BeginRead(Buffer, 0, Buffer.Length, new AsyncCallback(TcpCallBack), this);
                        //IsSocketConnected();
                        FileClient.WriteFailureInfo("UDP重新连接成功。" + temp);
                    }
                    //假如出现异常,将错误信息写入日志并进入下一次循环
                    catch (Exception e)
                    {
                        LastErrorMessage = string.Format("UDP重新连接失败:{0}。", e.Message) + temp;
                        FileClient.WriteExceptionInfo(e, LastErrorMessage, false);
                        continue;
                        //TODO: 是否抛出异常?
                        //throw; //假如不需要抛出异常,注释此句
                    }
                }
            }
        }
コード例 #5
0
        /// <summary>
        /// 侦听回调方法
        /// </summary>
        /// <param name="ar"></param>
        private void OnAccept(IAsyncResult ar)
        {
            try
            {
                Socket       new_accept = _socket.EndAccept(ar); //新连接socket
                ZProxySocket proxy      = GetProxy(new_accept);  //创建代理socket
                proxy.DisConnected    += new DisConnectedEventHandler(proxy_DisConnected);
                proxy.MessageReceived += new MessageReceivedEventHandler(proxy_MessageReceived);
                proxy.StartReceive();  //代理socket开始接收数据

                if (Connected != null)
                {
                    Connected.BeginInvoke(proxy, null, null);           //激发Connected事件
                }
                _socket.BeginAccept(new AsyncCallback(OnAccept), null); //开始下一次异步侦听
            }
            catch
            {
            }
        }
コード例 #6
0
        public void ConnectCallback(IAsyncResult ar)
        {
            string result = "Подключение успешно!";

            try
            {
                NodeData node = (NodeData)ar.AsyncState;

                //режим работы узлов и клиента определееются отдельно
                if (modeNetwork == Mode.Node)
                {
                    node.typeNode = NodeData.TypeNode.NODE;
                }
                else
                {
                    node.typeNode = NodeData.TypeNode.CLIENT;
                }
                NetworkStream ns = node.newNode.GetStream();
                node.newNode.EndConnect(ar);

                node.buffer = new byte[ConstField.LENGTHHEADER];
                ns.BeginRead(node.buffer, 0, node.buffer.Length, new AsyncCallback(ReadCallback), node);
                if (modeNetwork == Mode.Client)
                {
                    SendData("client");
                }
            }
            catch (Exception e)
            {
                DisconnectNode();
                result      = "Подключение провалено!";
                globalState = "ConnectCallback error | " + e;
            }

            if (Connected != null)
            {
                Connected.BeginInvoke(this, result, null, null);
            }
        }
コード例 #7
0
        /// <summary>
        /// 利用特定的本地端口与TCP服务端连接
        /// </summary>
        /// <param name="server">TCP服务端IP</param>
        /// <param name="port">端口号</param>
        /// <param name="localIp">本地IP</param>
        /// <param name="localPort">指定的本地端口(假如小于等于0则随机)</param>
        /// <returns>假如建立连接成功,返回1,否则返回0</returns>
        public int Connect(string server, int port, string localIp, int localPort)
        {
            //尝试建立连接
            int result = 1;

            try
            {
                ServerIp   = server;
                ServerPort = port;
                //BaseClient = new TcpClient(ServerIp, ServerPort);
                BaseClient = !string.IsNullOrWhiteSpace(localIp) && localPort > 0 ? new TcpClient(new IPEndPoint(IPAddress.Parse(localIp), localPort)) : new TcpClient();
                BaseClient.Connect(ServerIp, ServerPort);
                SetName(); //修改连接名称

                //重置重连次数,同时调用事件委托
                ReconnTimer = 0;
                if (ReconnTimerChanged != null)
                {
                    ReconnTimerChanged.BeginInvoke(Name, ReconnTimer, null, null);
                }

                BaseClient.ReceiveBufferSize = ReceiveBufferSize; //接收缓冲区的大小
                NetStream = BaseClient.GetStream();               //发送与接收数据的数据流对象
                raiser.Run();
            }
            catch (Exception e)
            {
                LastErrorMessage = string.Format("无法建立TCP连接,IP{0},端口号{1}:{2}", ServerIp, ServerPort, e.Message);
                if (logging)
                {
                    FileClient.WriteExceptionInfo(e, LastErrorMessage, false);
                }
                Close();
                result = 0;
                throw; //假如不需要抛出异常,注释此行
            }

            IsConnected = BaseClient.Connected;
            IsSocketConnected();
            if (IsConnected)
            {
                //调用Tcp连接事件委托
                if (Connected != null)
                {
                    Connected.BeginInvoke(Name, (new EventArgs()), null, null);
                }
                if (Thread_TcpReconnect == null)
                {
                    Auto_TcpReconnect   = new AutoResetEvent(true);
                    Thread_TcpReconnect = new Thread(new ThreadStart(TcpAutoReconnect))
                    {
                        IsBackground = true
                    };
                    //Thread_TcpReconnect.IsBackground = true;
                    Thread_TcpReconnect.Start();
                }
                else
                {
                    Auto_TcpReconnect.Set();
                }
                if (AutoReceive)
                {
                    NetStream.BeginRead(Buffer, 0, Buffer.Length, new AsyncCallback(TcpCallBack), this);
                }
            }
            return(result);
        }
コード例 #8
0
ファイル: AdminConnection.cs プロジェクト: Cloudxtreme/net
        public void HandleConnection(object unused)
        {
            Thread.Sleep(10);

            LingerOption lingerOption = new LingerOption(true, 10);

            connection.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, lingerOption);

            try
            {
                connection.Connect(ep);
            }
            catch {}

            int     ret;
            decimal dTimeOut = DateTime.Now.ToFileTime();

            string aData = "";
            string bData = "";

            byte[] RecvBytes;

            if (connection.Connected)
            {
                Connected.BeginInvoke(null, null, null, null);
            }

            while (connection.Connected && !disconnect)
            {
                if (connection.Available > 0)
                {
                    RecvBytes = new byte[connection.Available];
                    ret       = connection.Receive(RecvBytes, 0, RecvBytes.Length, SocketFlags.None);
                    aData     = aData + Encoding.ASCII.GetString(RecvBytes).Substring(0, ret);


                    while (aData.IndexOf(newline) > -1)
                    {
                        bData = Regex.Split(aData, newline)[0].ToString();
                        HandleData(bData);
                        aData = aData.Substring((aData.IndexOf(newline) + 2));
                    }
                    dTimeOut = DateTime.Now.ToFileTime();
                }
                else
                {
                    /*
                     * myData.bStayConnected = ((dTimeOut + 9000000000 /* 30 minutes )/* < DateTime.Now.ToFileTime() ? false : true);
                     * /*if (!myData.bStayConnected)
                     * {
                     *      Send("451 Timeout" + newline);
                     * }
                     */
                    Thread.Sleep(1);
                }
            }
            //mySocket.Shutdown(SocketShutdown.Both);
            connection.Close();
            try
            {
                Disconnected.BeginInvoke(null, null, null, null);
            }
            catch {}
        }