} // 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
/// <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