一、更新內容
1.修改*Server類,以及承繼關系。
2.增加IRunDevice的IServerProvider接口繼承。
3.修復增加COM設備驅動可能造成的異常。
4.修復網絡發送數據可能引發的異常。
5.完善協議驅動器。
6.修改協議驅動接口。
7.修改協議命令接口。
8.修復協議命令,抽象基類情況下的異常BUG。
9.增加協議接口GetPackageLength,數據交互更靈活。
10.修復一些BUG。
11.優化代碼。
二、GetPackageLength接口的使用
這個接口主要的使用場景是:當協議中有請求發送數據長度的命令,例如先向服務器發送數據包長度命令,得到返回確定後,再發送實際數據包信息。在連接發送大塊數據的時候,例如文件內容、序列化後的內容等,內容有可能包含協議的頭和尾,會影響數據包的完整性。主要用於交互連續的較大數據塊內容。
1.接口參數
/// <summary>
/// 獲得應該接收的數據長度,如果當前接收的數據小於這個返回值,那麼繼續接收數據,直到大於等於這個返回長度。如果接收數據超時,則直接返回當前已經接收的數據。
/// </summary>
/// <param name="data">接收的數據</param>
/// <param name="channel">IO通道,用於返回確認數據</param>
/// <param name="readTimeout">返回讀數據超時間隔時間</param>
/// <returns></returns>
public abstract int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout);
2.接口使用
(1)設置配置參數
IServer server = new ServerFactory().CreateServer(new ServerConfig()
{
ServerName = "服務1",
SocketMode = SocketMode.Tcp,
ControlMode = ControlMode.Loop,
CheckSameSocketSession = false,
StartCheckPackageLength = true, //開啟檢測數據包長度
NetReceiveBufferSize = 20,
});
(2)接口代碼
public override int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout)
{
if (data == null || data.Length <= 0)
return 0;
readTimeout = 2000;
if (CheckData(data))
{
try
{
int length = BitConverter.ToInt32(new byte[] {data[3], data[4], data[5], data[6]}, 0);
byte[] okBytes = System.Text.Encoding.ASCII.GetBytes("ok");
int num = channel.Write(okBytes);
if (num > 0)
{
Console.WriteLine("返回數據");
}
return length;
}
catch (Exception)
{
return 0;
}
}
else
{
Console.WriteLine("校驗錯誤");
return 0;
}
}
三、增加宿主程序(ServerSuperIO.Host)
static IServerFactory _serverFactory = null;
static void Main(string[] args)
{
Console.ForegroundColor = ConsoleColor.Green;
ConsoleUtil.SetConsoleCtrlHandler(new ConsoleUtil.ControlCtrlDelegate(HandlerRoutine), true);
bool success = true;
Console.WriteLine("正在初始化服務程序......");
IObjectBuilder builder = new TypeCreator();
_serverFactory = new ServerFactory();
try
{
GlobalConfig gc = GlobalConfigTool.Load();
foreach (ServerSuperIO.Config.Server serverCfg in gc.Servers)
{
IServer server = _serverFactory.CreateServer(serverCfg.ServerConfig);
server.AddDeviceCompleted += server_AddDeviceCompleted;
server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
server.Start();
_serverFactory.AddServer(server);
foreach (Config.Device devCfg in serverCfg.Devices)
{
try
{
IRunDevice runDev = builder.BuildUp<IRunDevice>(devCfg.AssemblyFile, devCfg.Instance);
runDev.DeviceParameter.DeviceID = devCfg.DeviceID;
runDev.DeviceDynamic.DeviceID = devCfg.DeviceID;
runDev.CommunicateType = devCfg.CommunicateType;
runDev.Initialize(devCfg.DeviceID);
if (server.AddDevice(runDev) != devCfg.DeviceID)
{
Console.WriteLine("增加設備:" + devCfg.DeviceID + " 失敗!");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
continue;
}
}
}
}
catch (Exception ex)
{
success = false;
Console.WriteLine(ex.Message);
}
if (success)
{
Console.WriteLine("初始化服務程序完成");
}
while ("exit" == Console.ReadLine())
{
_serverFactory.RemoveAllServer();
break;
}
}
private static bool HandlerRoutine(int ctrlType)
{
if (ctrlType == 0 || ctrlType == 2)
{
_serverFactory.RemoveAllServer();
}
return false;
}
}
四、增加配置工具(ServerSuperIO.Tool)
1.增加服務,如下圖:

2.增加設備,如下圖:

3.單擊樹型菜單,修改配置屬性。
