示例#1
0
        } // W_Main_Load

        /// <summary>
        /// 单击开始监听按钮
        /// </summary>
        /// <param name="sender">the sender</param>
        /// <param name="e">the e</param>
        private void btn_startListen_Click(object sender, EventArgs e)
        {
            //服务器已经其中监听,则返回
            if (IsStart)
            {
                return;
            }

            //启动侦听
            listener = ListenerHandler.GetListener();
            listener.Start(10);
            IsStart = true;
            lstBox_statu.Invoke(appendString, string.Format("服务器已经自动侦听!端点为{0}",
                                                            listener.LocalEndpoint.ToString()),
                                lstBox_statu);
            this.btn_startListen.Enabled = false;

            // 初始化要传入的数据
            AcceptCallBackParam acceptCallBackParam = new AcceptCallBackParam(listener, IsStart, lstBox_statu);

            AsyncCallback callBack = new AsyncCallback(CallBackFunc.acceptCallBack);

            listener.BeginAcceptSocket(callBack, acceptCallBackParam);
        } // btn_startListen_Click
示例#2
0
        /// <summary>
        /// 开始监听
        /// </summary>
        /// <param name="ar"></param>
        public static void acceptCallBack(IAsyncResult ar)
        {
            // 初始化需要用的委托
            Friends friends = Friends.GetInstance();

            DelegateMem.AppendDelegate appendString;
            appendString = new DelegateMem.AppendDelegate(DelegateMethod.appendMethod);

            try
            {
                // 初始化关键参数
                AcceptCallBackParam acceptCallBackParam = (AcceptCallBackParam)ar.AsyncState;
                TcpListener         listener            = acceptCallBackParam.listener;
                bool    IsStart      = acceptCallBackParam.IsStart;
                ListBox lstBox_statu = acceptCallBackParam.lstBox_statu;

                try
                {
                    //完成异步接受连接请求的异步调用
                    //将连接信息添加到列表和下拉列表
                    Socket   clientSocket = listener.EndAcceptSocket(ar);
                    MyFriend frd          = new MyFriend(clientSocket);

                    // 加入好友
                    lock (friends.friendList)
                    {
                        friends.friendList.Add(frd);
                    }

                    string connMsg = clientSocket.RemoteEndPoint.ToString() + "已连接...";
                    lstBox_statu.Invoke(appendString, connMsg, lstBox_statu);
                    AsyncCallback callBack;

                    if (IsStart)
                    {
                        callBack = new AsyncCallback(acceptCallBack);
                        listener.BeginAcceptSocket(callBack, acceptCallBackParam);
                    } // if

                    //开始在连接上进行异步的数据接收
                    frd.clearBuffer();

                    // 初始化要传入的参数
                    RecvCallBackParam recvCallBackParam = new RecvCallBackParam(
                        lstBox_statu,
                        frd,
                        appendString,
                        IsStart
                        );
                    callBack = new AsyncCallback(CallBackFunc.recvCallBack);
                    frd.socket.BeginReceive(frd.recvBuffer, 0, frd.recvBuffer.Length, SocketFlags.None, callBack, recvCallBackParam);
                } // try

                catch (System.Exception ex)
                {
                    IsStart = false;
                    acceptCallBackParam.IsStart = false;
                } // catch
            }     // try

            catch (System.Exception ex)
            {
                // 终于封装了这个异常!! 即调用stop只会关闭监听,但是仍然会执行这个函数,前面会转型失败.....跳转到这
            } // catch
        }     // acceptCallBack