一个winform的基于TCP的服务端的GPS平台的网关。利用多线程异步的方式 。

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

posted on 2011-06-07 11:03  梁子se7en  阅读(553)  评论(0编辑  收藏  举报