最近做模擬雷達推送數(shù)據(jù)的項目,用一個軟件模擬幾百臺雷達往后端推送數(shù)據(jù),數(shù)據(jù)處理的代碼我就不貼了,主要是建立socket連接和斷線重連部分的代碼。主要是針對服務端斷開連接后,客戶端這邊要重現(xiàn)服務器。
我是先從數(shù)據(jù)庫讀取數(shù)據(jù),對數(shù)據(jù)封裝傳到后端,讀數(shù)據(jù)的時候用一個List存放數(shù)據(jù)庫的雷達設備名稱,
/// <summary>
/// 根據(jù)設備建立socket連接
/// </summary>
public static void DeviSocketDic()
{
for(int i = 0; i < Settings.DeviceNumList.Count; i++)
{
TcpClient tcp = Connect();
if (!DeviceSocket.ContainsKey(Settings.DeviceNumList[i]))
{
DeviceSocket.Add(Settings.DeviceNumList[i], tcp);
IPEndPoint localIEP = (IPEndPoint)tcp.Client.LocalEndPoint;
PortList.Add(localIEP.Port.ToString());
}
}
}
/// <summary>
/// TCP連接
/// </summary>
/// <returns></returns>
public static TcpClient Connect()
{
try
{
tcpc = new TcpClient();
tcpc.Connect(ip, int.Parse(port));//連接到服務
}
catch (Exception)
{
return null;
}
return tcpc;
}
public static Dictionary<string, TcpClient> DeviceSocket = new Dictionary<string, TcpClient>();
public static List<string> DeviceNumList = new List<string>();
private static TcpClient tcpc = null;
public static string ip = string.Empty;
public static string port = string.Empty;
以上代碼實現(xiàn)建立很多個socket連接存放到字典里面,變量定義我放在代碼后面了。
foreach (KeyValuePair<string, TcpClient> item in HTTPServer.DeviceSocket)
{
if (item.Value.Client.Poll(20, SelectMode.SelectRead) && item.Value.Client.Available == 0)
{
item.Value.Close();
HTTPServer.DeviceSocket[item.Key] = HTTPServer.Connect();
}
}
上面對字典遍歷的代碼我刪掉了一些,對控件判斷和顯示的部分,主要的就在這里面了,if對socket判斷,不存在就關閉連接,重新建連接寫到字典里面。數(shù)據(jù)處理部門就對字典遍歷選取設備號對應的socket連接。項目里面我做了個定時300ms查詢一次連接是否還在定時器任務。代碼如下
public void ConnectStateTiming()
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Enabled = true;
timer.Interval = 300;//執(zhí)行間隔時間,單位為毫秒
timer.Start();
timer.Elapsed += new System.Timers.ElapsedEventHandler(FlashConnectState);
}