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