using System; using System.Collections; using System.Collections.Specialized; using System.Text; using System.Threading; using System.Net.Sockets; using System.Net; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.IO; using System.Data; using System.Windows.Forms; using System.Configuration; namespace WSGPSGateway { public partial class TcpServer : Form { public TcpServer() { InitializeComponent(); } #region 自定义字段 /// <summary> /// 监听控件开启状态 /// </summary> private bool State = true; /// <summary> /// 声明一个线程实例 /// </summary> private Thread mythread; /// <summary> /// 服务器端Ip /// </summary> private int _port = Convert.ToInt32(ConfigurationManager.AppSettings["Port"]); /// <summary> /// 判断离线时间差设置 /// </summary> private string _spandate = ConfigurationManager.AppSettings["Spandates"]; /// <summary> /// 保存客户端所有回话的哈希表 /// </summary> private Hashtable _transmit_tb = new Hashtable(); /// <summary> /// 用于接受消息的线程 /// </summary> private Thread _receviccethread = null; public struct TCPParameter { public string Package; public string IpAddress; } #endregion #region 监听代码块 //窗体运行 private void TcpServer_Load(object sender, EventArgs e) { this.Hide(); Form.CheckForIllegalCrossThreadCalls = false; try { InitializeComponent(); mythread = new Thread(Listen); mythread.Start(); } catch (Exception ex) { DAL.Log.Write(DateTime.Now + ex.ToString() + "\r\n"); } } private object threadlock = new object(); //启动监听 private void BtnStart_Click(object sender, EventArgs e) { //锁定区域同时进行数据处理 Monitor.Enter(threadlock); try { //启动线程 ThreadStart thsrt = new ThreadStart(Listen); //10个线程全部执行统一的方法 Thread[] threads = new Thread[10]; if (State) //如果状态是true,表示可以开启 { //循环10个线程 for (int i = 0; i < 10; i++) { threads[i] = new Thread(thsrt); //设置线程为后台后台线程 ,也叫守护线程 threads[i].IsBackground = true; } //循环遍历所有的10个线程 foreach (Thread th in threads) { //开启线程 th.Start(); } //将状态改为false State = false; this.Messagetxt.Text = "服务已启动,正在侦听..."; } else { //中断线程 mythread.Interrupt(); //终止线程 mythread.Abort(); State = true; this.Messagetxt.Text = "服务已关闭,等待开启..."; } } catch (Exception ex) { DAL.Log.Write(DateTime.Now + ex.ToString() + "\r\n"); } finally { //退出对于线程的锁定 Monitor.Exit(threadlock); } } //启动监听,轮询监听客户机请求并将客户端套接字存入转发表 private void Listen() { try { IPAddress _ip = IPAddress.Any; Socket newsoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); newsoc.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); IPEndPoint locaEp = new IPEndPoint(IPAddress.Any, _port);//建立连接 newsoc.Bind(locaEp); newsoc.Listen(100); newsoc.BeginAccept(new AsyncCallback(onCall), newsoc);//继续接受其他客户端的连接 } catch (Exception ex) { DAL.Log.Write(DateTime.Now.ToString() + ex.ToString() + "\r\n"); } } //监听回调 private void onCall(IAsyncResult ar) { try { Socket serverSoc = (Socket)ar.AsyncState; Socket clent = serverSoc.EndAccept(ar); byte[] comes = new byte[1024]; EndPoint enp = clent.RemoteEndPoint; serverSoc.BeginAccept(new AsyncCallback(onCall), serverSoc); while (true) { int re = clent.Receive(comes); clent.Send(Encoding.ASCII.GetBytes("ok!")); TCPParameter parm = new TCPParameter(); parm.Package = Encoding.UTF8.GetString(comes, 0, re); parm.IpAddress = clent.RemoteEndPoint.ToString(); if (parm.Package.Length == 0) { _receviccethread.Interrupt(); _receviccethread.Abort(); } Receive(parm.Package, parm.IpAddress); } } catch (Exception ex) { DAL.Log.Write(DateTime.Now.ToString() + ex.ToString() + "\r\n"); } } //处理解析数据 private void Receive(string msg, string ip) { ArrayList MessageRet = BLL.ClientLib.AdapterFactory.Prepare(msg,ip);//转入适配器并返回解析后数据 if (MessageRet.Count != 0) { BLL.ClientLib.ResloveBuffer resbuf = new BLL.ClientLib.ResloveBuffer(); resbuf.Prepare(MessageRet[0].ToString(), ip);//将数据二次解析后保存数据库 } } #endregion #region 关闭与退出 //窗体关闭 private void TcpServer_FormClosing(object sender, FormClosingEventArgs e) { try { if (mythread != null) { mythread.Interrupt(); mythread.Abort(); GC.Collect(); } else { this.Messagetxt.Text = "系统正在运行中..."; } } catch (Exception ex) { DAL.Log.Write(DateTime.Now + ex.ToString() + "\r\n"); } } #endregion #region 执行定时任务 //执行定时查询设备状态 private void timers_Tick(object sender, EventArgs e) { try { DAL.DeviceinfoDataSetTableAdapters.P_SELENABLEBYNUMBERTableAdapter da = new DAL.DeviceinfoDataSetTableAdapters.P_SELENABLEBYNUMBERTableAdapter(); da.P_UPDSTATEBYTIME(_spandate); } catch (Exception ex) { DAL.Log.Write(DateTime.Now + "\0" + ex + "\0\t\n"); } } #endregion } }