using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; using System.Net; using System.Net.Sockets; using System.Threading; using System.Data.SqlClient; namespace MiData { public partial class Form1 : Form { delegate void SetTextCallBack(string msg,string type); private event SetTextCallBack doSetText; Thread _acceptWorkThread = null; Socket _listener = null; bool _isListener = true; int OnlineSum = 0; private void CallBack(string msg,string type) { if (doSetText!=null) { doSetText(msg,type); } } private void SetText(string msg,string type) { if (lbMessage.InvokeRequired) { Invoke(new SetTextCallBack(SetText), new object[] { msg,type }); } else { if (type=="sum") { this.lbOnLine.Text = msg; } else if (type=="msg") { this.lbMessage.AppendText(msg+"/r/n"); } } } public Form1() { InitializeComponent(); doSetText += SetText; } /// <summary> /// 启动 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnStart_Click(object sender, EventArgs e) { this.btnStart.Enabled = false; this.btnStop.Enabled = true; _isListener = true; _listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint localEP = new IPEndPoint(IPAddress.Any, 8988); _listener.Bind(localEP); _listener.Listen(100); _acceptWorkThread = new Thread(AcceptWorkThread); _acceptWorkThread.Start(); } /// <summary> /// 侦听 /// </summary> private void AcceptWorkThread() { while (_isListener) { UserInfo info = new UserInfo();//这个UserInfo是用来保存客户信息的。 Socket socket = _listener.Accept(); info.socket = socket; CallBack((++OnlineSum).ToString(), "sum"); //这里进行其它处理。 socket.BeginReceive(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, ReceiveCallBack, info);//这里向系统投递一个接收信息的请求,并为其指定ReceiveCallBack做为回调函数 } } /// <summary> /// 收到连接回调函数 /// </summary> /// <param name="ar"></param> private void ReceiveCallBack(IAsyncResult ar) { UserInfo info = (UserInfo)ar.AsyncState; Socket handler = info.socket; int readCount = 0; try { readCount = handler.EndReceive(ar);//调用这个函数来结束本次接收并返回接收到的数据长度。 } catch (SocketException)//出现Socket异常就关闭连接 { CloseSocket(info);//这个函数用来关闭客户端连接 return; } catch { } if (readCount > 0) { byte[] buffer = new byte[readCount]; Buffer.BlockCopy(info.Buffer, 0, buffer, 0, readCount); Analyzer(info, buffer);//这个函数用来处理接收到的信息。 try { handler.BeginReceive(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), info);//向系统投递下一个接收请求 } catch (SocketException) //出现Socket异常就关闭连接 { CloseSocket(info); } catch { } } else //如果接收到0字节的数据说明客户端关闭了Socket,那我们也要关闭Socket { CloseSocket(info); } } /// <summary> /// 断开连接 /// </summary> /// <param name="info"></param> private void CloseSocket(UserInfo info) { info.socket.Shutdown(SocketShutdown.Both); info.socket.Close(); CallBack((--OnlineSum).ToString(),"sum"); } /// <summary> /// 收到信息后的操作 /// </summary> /// <param name="info"></param> /// <param name="buff"></param> private void Analyzer(UserInfo info, byte[] buff) { string sql = Encoding.Default.GetString(buff); Console.WriteLine(sql); CallBack(sql,"msg"); DataTable dt = GetDataTableBySql(sql); Send(info, Encoding.Default.GetBytes(ConvertBetweenDataTableAndXML_AX(dt))); } /// <summary> /// 发送数据 /// </summary> /// <param name="info"></param> /// <param name="message"></param> private void Send(UserInfo info, byte[] message) { try { info.socket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendCallBack), info);//这里向系统投递一个发送数据的请求,并指定一个回调函数。 } catch (SocketException ex) { CloseSocket(info); } catch { } } /// <summary> /// 发送数据回调函数 /// </summary> /// <param name="ar"></param> private void SendCallBack(IAsyncResult ar) { UserInfo info = (UserInfo)ar.AsyncState; try { info.socket.EndSend(ar);//调用这个函数来结束本次发送。 } catch { } } /// <summary> /// 查找数据 /// </summary> /// <param name="sql"></param> /// <returns></returns> public DataTable GetDataTableBySql(string sql) { return DBHelper.GetDataTable(sql); } /// <summary> /// DataTable转XML /// </summary> /// <param name="dtNeedCoveret"></param> /// <returns></returns> public static string ConvertBetweenDataTableAndXML_AX(DataTable dtNeedCoveret) { System.IO.TextWriter tw = new System.IO.StringWriter(); dtNeedCoveret.TableName = dtNeedCoveret.TableName.Length == 0 ? "Table_AX" : dtNeedCoveret.TableName; dtNeedCoveret.WriteXml(tw); dtNeedCoveret.WriteXmlSchema(tw); return tw.ToString(); } /// <summary> /// 停止 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnStop_Click(object sender, EventArgs e) { _acceptWorkThread.Abort(); _isListener = false; try { _listener.Shutdown(SocketShutdown.Both); } catch { } try { _listener.Close(); } catch{} this.btnStart.Enabled = true; this.btnStop.Enabled = false; CallBack("0","sum"); } } /// <summary> /// 客户信息 /// </summary> class UserInfo { public Socket socket; public byte[] Buffer = new byte[2046]; } }