📄 sp.cs
字号:
/* jll(2005)版权所有,保留所有权力
* 文件名:sp.cs
* 用 途:用于管理二级sp的记录,它从subSP表中读取记录并放在内存中,之后可以方便地对其进行CRUD等操作
* 作 者:jll
* 完成日期:2005年8月2日
* 修订记录:
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Net;
namespace JLL.SGIP
{
/// <summary>
/// 对应于二级sp的定义
/// </summary>
public class SubSP
{
private string _spNumber;
private string _serviceTag;
private string _spID;
private string _corpID;
private string _ip;
private int _deliverPort;
private string _loginName;
private string _password;
private int _maxConnection = 3; //允许建立的最大的连接数
private int _maxWaitAnswerCommand = 32;//一个连接所允许的最多的待应答命令数
private int _answerTimeout = 30; //命令应答的最长时限,以秒为单位
private int _idleTimeOut = 60; //客户端连接的最大空闲时间,超过则被断开, 以秒为单位
/// <summary>
/// 允许建立的最大的连接数, 即本程序向二级sp建立socket建立的最大个数
/// </summary>
public int MaxConnection
{
get { return _maxConnection; }
set { _maxConnection = value; }
}
/// <summary>
/// 一个连接所允许的最多的待应答命令数
/// </summary>
public int MaxWaitAnswerCommand
{
get { return _maxWaitAnswerCommand; }
set { _maxWaitAnswerCommand = value; }
}
/// <summary>
/// 命令应答的最长时限,以秒为单位
/// </summary>
public int AnswerTimeout
{
get { return _answerTimeout; }
set { _answerTimeout = value; }
}
/// <summary>
/// 客户端连接的最大空闲时间,超过则被断开, 以秒为单位(这个值仅在作为服务器时使用, 故而本程序应该用不到它)
/// </summary>
public int IdleTimeout
{
get { return _idleTimeOut; }
set { _idleTimeOut = value; }
}
/// <summary>
/// 二级sp的接入号
/// </summary>
public string SPNumber
{
get { return _spNumber; }
set
{
SgipHelper.CheckMaxBytes(value, 21);
_spNumber = value;
}
}
/// <summary>
/// 二级sp的业务代码,对应于Submit的ServiceType字段(?)
/// </summary>
public string ServiceTag
{
get { return _serviceTag; }
set
{
SgipHelper.CheckMaxBytes(value, 10);
_serviceTag = value;
}
}
/// <summary>
/// 二级sp的结点编码,应将它设为一级sp的结点编号(NodeID)
/// </summary>
public string SPID
{
get { return _spID; }
set
{
SgipHelper.CheckMaxBytes(value, 10);
_spID = value;
}
}
/// <summary>
/// 二级sp的企业代码,应与一级sp的企业代码相同
/// </summary>
public string CorpID
{
get { return _corpID; }
set
{
SgipHelper.CheckMaxBytes(value, 5);
_corpID = value;
}
}
/// <summary>
/// 二级sp的IP地址
/// </summary>
public string IP
{
get { return _ip; }
set { _ip = value; }
}
/// <summary>
/// 二级sp所监听的Deliver端口,
/// </summary>
public int DeliverPort
{
get { return _deliverPort; }
set
{
_deliverPort = value;
}
}
/// <summary>
/// 二级sp的登录名
/// </summary>
public string LoginName
{
get { return _loginName; }
set
{
SgipHelper.CheckMaxBytes(value, 16);
_loginName = value;
}
}
/// <summary>
/// 二级sp的密码
/// </summary>
public string Password
{
get { return _password; }
set
{
SgipHelper.CheckMaxBytes(value, 16);
_password = value;
}
}
}
public class SubSPCollection : List<SubSP>
{
}
public class SubSPManager
{
private SubSPCollection _spList = new SubSPCollection();
private string _xmlFile;
internal SubSPManager()
{
_xmlFile = SgipHelper.GetCurrentAssemblyPath() + "subsp.xml";
LoadData();
}
public void LoadData()
{
lock (this)
{
if (System.IO.File.Exists(_xmlFile))
{
_spList = SgipHelper.LoadFromXmlFile<SubSPCollection>(_xmlFile);
}
else
{
_spList = new SubSPCollection();
}
}
}
public void SaveData()
{
SgipHelper.SaveAsXML(_xmlFile, _spList);
}
private static SubSPManager _spManager = null;
private static void CreateObject(object state)
{
_spManager = new SubSPManager();
}
/// <summary>
/// 必须先用BuildManager方法才能调用Manager属性!ps:static变量是在第一次用到时初始化,由于这里要预先建立起缓冲,所以就必须调用这个方法
/// </summary>
public static void BuildManager()
{
if (_spManager == null)
{
//序列化很要时间,所以用线程来处理
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(CreateObject));
}
}
public static SubSPManager Manager
{
get
{
if (_spManager == null)
{
BuildManager();
}
return _spManager;
}
}
public void Add(SubSP sp)
{
_spList.Add(sp);
}
public void Remove(SubSP sp)
{
_spList.Remove(sp);
}
public SubSP FindByLoginName(string str)
{
lock (this)
{
return _spList.Find(delegate(SubSP sp) { return (sp.LoginName == str); });
}
}
public SubSP FindBySPNumber(string str)
{
lock (this)
{
return _spList.Find(delegate(SubSP sp) { return (sp.SPNumber == str); });
}
}
public SubSP FindBySPID(string str)
{
lock (this)
{
return _spList.Find(delegate(SubSP sp) { return (sp.SPID == str); });
}
}
public SubSP FindByCorpID(string str)
{
lock (this)
{
return _spList.Find(delegate(SubSP sp) { return (sp.CorpID == str); });
}
}
public SubSP FindByIP(string ip)
{
lock (this)
{
return _spList.Find(delegate(SubSP sp) { return (sp.IP == ip); });
}
}
/// <summary>
/// 获得二级sp的个数
/// </summary>
public int Count
{
get { return _spList.Count; }
}
}
#region sql脚本定义
/*
* 以下是sql脚本
CREATE TABLE [subSP] (
[DBkeyID] [int] IDENTITY (1, 1) NOT NULL ,
[SPNumber] [varchar] (21) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ServiceTag] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SPID] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[CorpId] [char] (5) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SPIP] [int] NOT NULL ,
[SPListenPort] [int] NOT NULL ,
[LoginName] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Password] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_subSP] PRIMARY KEY CLUSTERED
(
[DBkeyID]
) ON [PRIMARY]
) ON [PRIMARY]
GO
*/
#endregion
#region 数据库版本
/*
/// <summary>
/// 对应于二级sp的定义
/// </summary>
public class SubSP
{
private int _dbKeyID;
private string _spNumber;
private string _serviceTag;
private string _spID;
private string _corpID;
private int _ip;
private int _listenPort;
private string _loginName;
private string _password;
/// <summary>
/// 数据库主键的ID
/// </summary>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -