?? 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 + -