using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; namespace 异步TCP服务端 { public partial class Form1 : Form { private IPAddress LocalIP; private Socket LocalSocket; private byte[] bytes = new byte[1024]; private byte[] data = new byte[1024]; private string msgBuffer = ""; private Socket RemoteSocket; private IPAddress[] ips; private const int port_server = 5555; //private byte[] buffer=new byte[1024]; public Form1() { InitializeComponent(); } #region 窗体加载 //加载窗体的时候: //1、绑定IP地址 //2、监听 //3、接受连接并返回ClientSocket(RemoteSocket) private void Form1_Load(object sender, EventArgs e) { //获取IP地址并指定端口 ips = Dns.GetHostAddresses(Dns.GetHostName()); foreach (IPAddress myhost_ip in ips) { if (myhost_ip.AddressFamily == AddressFamily.InterNetwork) { LocalIP = myhost_ip; break; } } IPEndPoint IEP = new IPEndPoint(LocalIP, port_server); //绑定IP地址 LocalSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); LocalSocket.Bind((EndPoint)IEP); LocalSocket.Listen(10); //监听 //接受连接 LocalSocket.BeginAccept( new AsyncCallback(acceptCallback), //委托,指定回调函数 LocalSocket //state对象,包含本机的状态信息 ); } #endregion #region // 接受连接回调函数 private void acceptCallback(IAsyncResult ar) { //执行连接的接受操作 Socket temp = (Socket)ar.AsyncState; RemoteSocket = temp.EndAccept(ar); //接受连接请求 string str_iep=RemoteSocket.RemoteEndPoint.ToString(); showuserbox.Items.Add(str_iep+"在线"); //开始异步的数据接收 RemoteSocket.BeginReceive( bytes, //指定接收数据的容器(buffer) 0, 1024, SocketFlags.None, new AsyncCallback(receiveCallback),//指定回调函数 RemoteSocket); //指定传送给回调函数的状态参数 } #endregion //接收数据回调函数 //执行数据的接收 #region private void receiveCallback(IAsyncResult ar) { Socket temp = (Socket)ar.AsyncState; int length = temp.EndReceive(ar); //开始下一次的异步数据 temp.BeginReceive( bytes, //指定接收数据的容器(buffer) 0, 1024, SocketFlags.None, new AsyncCallback(receiveCallback),//指定回调函数 temp); //指定传送给回调函数的状态参数 msgBuffer = Encoding.UTF8.GetString(bytes); Thread redatathread=new Thread(show_data); redatathread.Start(); } private void show_data() { show_msg_list(msgBuffer); } #endregion //点击发送按钮:发送数据 private void send_Click(object sender, EventArgs e) { data = Encoding.UTF8.GetBytes("浪子:"+content.Text); RemoteSocket.BeginSend( //把服务端的数据发送到客户端 data, 0, //使用RemoteSocket进行发送 data.Length, SocketFlags.None, new AsyncCallback(sendCallback), RemoteSocket); msg.Items.Add(DateTime.Now.ToString()); msg.Items.Add("浪子:" + content.Text); //tems.Add(hostname+content.Text+DateTime.Now.ToString()); } private void sendCallback(IAsyncResult ar) { Socket temp = (Socket)ar.AsyncState; temp.EndSend(ar); } private delegate void datadelegate(String str);//委托 private void show_msg_list(string str) { if (msg.InvokeRequired) { datadelegate datag = show_msg_list; msg.Invoke(datag, str); } else { msg.Items.Add(DateTime.Now.ToString()); msg.Items.Add(str); } } } }