问题描述
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Net;usingSystem.Net.Sockets;namespaceAsynTcpServer{publicpartialclassfrm_Main:Form{TcpListenerListener;List<MyFriend>Friends;publicfrm_Main(){InitializeComponent();}privatevoidbtn_Clear_Click(objectsender,EventArgse){lst_Info.Items.Clear();}privatevoidfrm_Main_Load(objectsender,EventArgse){textBox1.Text=land.userName;//IPAddressmyip=Dns.GetHostAddresses(Dns.GetHostName())[0];IPAddressmyip=IPAddress.Parse("127.0.0.1");IPEndPointmyep=newIPEndPoint(myip,5000);Listener=newTcpListener(myep);Friends=newList<MyFriend>();//buffer=newbyte[128];}delegatevoidShowInfoDel(Stringstr);privatevoidShowInfo(Stringstr){if(lst_Info.InvokeRequired){ShowInfoDeld=newShowInfoDel(ShowInfo);lst_Info.Invoke(d,str);}else{lst_Info.Items.Add(System.DateTime.Now);lst_Info.Items.Add(str);lst_Info.SelectedIndex=lst_Info.Items.Count-1;lst_Info.ClearSelected();}}delegatevoidFriendDel(MyFriendfriend);privatevoidAddFriend(MyFriendfriend){if(cmb_Friend.InvokeRequired){FriendDeld=newFriendDel(AddFriend);cmb_Friend.Invoke(d,friend);}else{cmb_Friend.Items.Add(friend.socket.RemoteEndPoint.ToString());Friends.Add(friend);}}privatevoidRemoveFriend(MyFriendfriend){if(cmb_Friend.InvokeRequired){FriendDeld=newFriendDel(RemoveFriend);cmb_Friend.Invoke(d,friend);}else{intindex=Friends.IndexOf(friend);cmb_Friend.Items.RemoveAt(index);Friends.RemoveAt(index);}}privatevoidbtn_Start_Click(objectsender,EventArgse){Listener.Start();ShowInfo(String.Format("启动了服务器的侦听:{0}",Listener.LocalEndpoint.ToString()));AsyncCallbackcallback=newAsyncCallback(AcceptCallBack);Listener.BeginAcceptSocket(callback,Listener);ShowInfo(String.Format("异步接受客户端的连接请求"));}privatevoidAcceptCallBack(IAsyncResultar){TcpListenerListener=(TcpListener)ar.AsyncState;Socketclient;try{client=Listener.EndAcceptSocket(ar);}catch{return;}ShowInfo(String.Format("成功地接受了{0}的连接请求",client.RemoteEndPoint.ToString()));AsyncCallbackcallback=newAsyncCallback(AcceptCallBack);Listener.BeginAcceptSocket(callback,Listener);MyFriendfriend=newMyFriend(client);AddFriend(friend);friend.ClearBuffer();callback=newAsyncCallback(ReceiveCallBack);friend.socket.BeginReceive(friend.Rcvbuffer,0,friend.Rcvbuffer.Length,SocketFlags.None,callback,friend);}privatevoidReceiveCallBack(IAsyncResultar){MyFriendfriend=(MyFriend)ar.AsyncState;try{Int32count=friend.socket.EndReceive(ar);if(count==0)thrownewException();StringstrRcv=System.Text.Encoding.Default.GetString(friend.Rcvbuffer,0,count);ShowInfo(String.Format("{0}:{1}",friend.socket.RemoteEndPoint.ToString(),strRcv));AsyncCallbackcallback=newAsyncCallback(ReceiveCallBack);friend.socket.BeginReceive(friend.Rcvbuffer,0,friend.Rcvbuffer.Length,SocketFlags.None,callback,friend);}catch{RemoveFriend(friend);friend.Dispose();}}privatevoidbtn_Stop_Click(objectsender,EventArgse){Listener.Stop();}privatevoidfrm_Main_FormClosing(objectsender,FormClosingEventArgse){Application.Exit();}privatevoidbtn_Send_Click(objectsender,EventArgse){if(cmb_Friend.SelectedIndex<0){ShowInfo("请选择发送对象");cmb_Friend.Focus();return;}if(txt_Send.Text.Trim().Length==0){ShowInfo("请填写要发送的信息");txt_Send.Focus();return;}Byte[]data=System.Text.Encoding.Default.GetBytes(txt_Send.Text.Trim());Friends[cmb_Friend.SelectedIndex].socket.Send(data,0,data.Length,SocketFlags.None);}}}