zoukankan      html  css  js  c++  java
  • 一个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
        }
    }
    
  • 相关阅读:
    Oracle导数据到SQL server的方法总结
    linux vmware 安装步骤
    linux user
    linux 下载jdk
    Jaxb2实现JavaBean与xml互转的方法详解
    idea 远程代码调试
    Java一次读取文本文件所有内容
    mysql 8 server windows 安装经验分享
    java和mysql的length()区别及char_length()
    Java web 强制301跳转
  • 原文地址:https://www.cnblogs.com/lelese7en/p/2074134.html
Copyright © 2011-2022 走看看