最近的项目中遇到了,使用多台服务器,多个客户端来运行一个分布式存储、计算应用程序。总是打开远程连接太过于麻烦且网速慢的原因,所以写一个的调度的程序。
情况如下:
环境:N台Server,N台Client,一台调度机子
功能:
(1),在调度机上通过命令行连接远程机器,并传入相应的指令
(2),客户端通过Socket监听调度机指点的端口
(3) ,接受到指令后,客户端用process class执行批处理文件
布署:
在被调度机器上将程序的server端添到windows service中,可以使用如下命令(批处理)
1 set BIN_PATH=D:\**\bin\Debug
2 set SERVICE_NAME=服务名称
3 set SERVICE_Description=描述
4
5 cd /d "%BIN_PATH%"
6
7 sc stop %SERVICE_NAME%
8 sc delete %SERVICE_NAME%
9
10 sc create %SERVICE_NAME% binpath= "%cd%\server.exe" start= auto
11 sc description %SERVICE_NAME% "%SERVICE_Description%"
12 sc start %SERVICE_NAME%
13
2 set SERVICE_NAME=服务名称
3 set SERVICE_Description=描述
4
5 cd /d "%BIN_PATH%"
6
7 sc stop %SERVICE_NAME%
8 sc delete %SERVICE_NAME%
9
10 sc create %SERVICE_NAME% binpath= "%cd%\server.exe" start= auto
11 sc description %SERVICE_NAME% "%SERVICE_Description%"
12 sc start %SERVICE_NAME%
13
14 cmd
Client side代码:
1
public static void StartClient()
2
{
3
string strParamater = TArgs.MachineList + ";" + TArgs.CommandName + ";" + TArgs.ProcessName + ";" + TArgs.ProgramPath;
4![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
// Data buffer for incoming data.
6
byte[] bytes = new byte[1024];
7![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
// Connect to a remote device.
9
try
10
{
11![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
IPHostEntry ipHostInfo = null;
13
List<IPAddress> iplist = new List<IPAddress>();
14![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
string strHostName = TArgs.MachineList;
16
string[] iArrHostName = strHostName.Split(',');
17
for (int i = 0; i < iArrHostName.Length; i++)
18
{
19
ipHostInfo = Dns.Resolve(iArrHostName[i]);
20
iplist.Add(ipHostInfo.AddressList[0]);
21
}
22![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
for (int i = 0; i < iplist.Count; i++)
24
{
25
// Connect the socket to the remote endpoint. Catch any errors.
26
try
27
{
28
Console.WriteLine("Socket connected to {0}", iArrHostName[i].ToString());
29![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
// Create a TCP/IP socket.
31
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
32![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
sender.Connect(iplist[i], 11000);
34
35
// Encode the data string into a byte array.
36
byte[] msg = Encoding.ASCII.GetBytes( strParamater + "<EOF>");
37![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
38
// Send the data through the socket.
39
int bytesSent = sender.Send(msg);
40![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
// Receive the response from the remote device.
42
int bytesRec = sender.Receive(bytes);
43
Console.WriteLine("Echoed string = {0}", Encoding.ASCII.GetString(bytes, 0, bytesRec));
44![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
// Release the socket.
46
sender.Shutdown(SocketShutdown.Both);
47
sender.Close();
48![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
Console.WriteLine("successful!");
50
Console.WriteLine("");
51![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
52
}
53
catch (ArgumentNullException ane)
54
{
55
Console.WriteLine("failed!");
56
Console.WriteLine("{1};ArgumentNullException : {0}", ane.ToString(), iplist[i].ToString());
57
Console.WriteLine("");
58
}
59
catch (SocketException se)
60
{
61
Console.WriteLine("failed!");
62
Console.WriteLine("{1};SocketException : {0}", se.Message,iplist[i].ToString() );
63
Console.WriteLine("");
64
//Console.WriteLine("SocketException : {0}",se.ToString());
65![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
66
}
67
catch (Exception e)
68
{
69
Console.WriteLine("failed!");
70
Console.WriteLine("{1};Unexpected exception : {0}", e.ToString(),iplist[i].ToString() );
71
Console.WriteLine("");
72
}
73
}
74![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
75
}
76
catch (Exception e)
77
{
78
Console.WriteLine(e.ToString());
79
}
80
}
81
static InputArgs TArgs = new InputArgs();
82![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
83
public static int Main(String[] args)
84
{
85
if (!Parser.ParseArgumentsWithUsage(args, TArgs))
86
{
87
return 0;
88
}
89![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
90
StartClient();
91
return 0;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
40
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
42
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
43
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
44
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
46
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
47
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
48
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
50
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
51
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
52
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
53
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
54
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
55
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
56
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
57
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
58
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
59
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
60
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
61
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
62
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
63
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
64
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
65
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
66
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
67
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
68
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
69
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
70
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
71
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
72
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
73
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
74
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
75
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
76
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
77
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
78
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
79
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
80
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
81
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
82
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
83
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
84
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
85
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
86
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
87
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
88
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
89
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
90
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
91
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
92 }
1
class InputArgs
2
{
3
[Argument(ArgumentType.Required, LongName = "MachineList", ShortName = "ML", HelpText = "machine list,such as server1,server2")]
4
public string MachineList = string.Empty;
5![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
[Argument(ArgumentType.Required, LongName = "CommandName", ShortName = "CN", HelpText = "Command name ,it cantain create,restart,delete,stop,killClientAll, strartClient and other(path+file)")]
7
public string CommandName = string.Empty;
8![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
[Argument(ArgumentType.AtMostOnce, LongName = "ProcessName", ShortName = "PN", HelpText = "process name,which need to kill")]
10
public string ProcessName = string.Empty;
11![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
[Argument(ArgumentType.AtMostOnce, LongName = "ProgramPath", ShortName = "PP", HelpText = "program path which need to start")]
13
public string ProgramPath = string.Empty;
14![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
16
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
Server side代码:
1
// Incoming data from the client.
2
public static string data = null;
3![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
public static void StartListening()
5
{
6
// Data buffer for incoming data.
7
byte[] bytes = new Byte[1024];
8![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
IPAddress ipAddress = IPAddress.Any;
10
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
11![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
// Create a TCP/IP socket.
13
Socket listener = new Socket(AddressFamily.InterNetwork,
14
SocketType.Stream, ProtocolType.Tcp);
15![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
string istrLocalHostName = string.Empty;
17
Socket handler = null;
18![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
// Bind the socket to the local endpoint and
20
// listen for incoming connections.
21
try
22
{
23
listener.Bind(localEndPoint);
24
listener.Listen(10);
25![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
// Start listening for connections.
27
while (true)
28
{
29
try
30
{
31![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
Console.WriteLine("Waiting for a connection
");
33
// Program is suspended while waiting for an incoming connection.
34
handler = listener.Accept();
35
data = null;
36![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
// An incoming connection needs to be processed.
38
while (true)
39
{
40
bytes = new byte[1024];
41
int bytesRec = handler.Receive(bytes);
42
data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
43
if (data.IndexOf("<EOF>") > -1)
44
{
45
break;
46
}
47
}
48![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
if (data != null)
50
data = data.Replace("<EOF>", "");
51![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
52
//information(machine list,command)
53
istrLocalHostName = Dns.GetHostName();
54
string[] strArrMachineList = data.Split(';')[0].Split(',');
55![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
56
string strCmd = data.Split(';')[1];
57
bool bltemp = false;
58
for (int i = 0; i < strArrMachineList.Length; i++)
59
{
60
if (strArrMachineList[i] == istrLocalHostName)
61
bltemp = true;
62
}
63
if (!bltemp)
64
{
65
Console.WriteLine("{0}", "Not contain my hostname in list!");
66
return;
67
}
68![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
69
//Handle the command
70
switch (strCmd)
71
{
72
case "create":
73
//create service with the path
74
Process.Start("Service_Create.bat");
75
Console.WriteLine("create service, the path: {0}", strCmd);
76![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
77
break;
78
case "restart":
79
Process.Start("Service_Restart.bat");
80
Console.WriteLine("restart the service,the path : {0}", strCmd);
81
break;
82
case "delete":
83
Process.Start("Service_Delete.bat");
84
Console.WriteLine("delete the service,the path : {0}", strCmd);
85
break;
86
case "stop":
87
Process.Start("Service_Stop.bat");
88
Console.WriteLine("stop the service,the path : {0}", strCmd);
89
break;
90
case "killClientAll":
91
string iProcessName = data.Split(';')[2];
92
Process[] proS = Process.GetProcessesByName(iProcessName);
93
for (int i = 0; i < proS.Length; i++)
94
{
95
proS[i].Kill();
96
}
97
Console.WriteLine("kill process: {0}", iProcessName);
98
break;
99
case "strartClient":
100
string iPath = data.Split(';')[3];
101
Process.Start(iPath);
102
Console.WriteLine("start program: {0}", iPath);
103
break;
104![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
105
default:
106
if (data != null)
107
{
108
Process.Start(data);
109
Console.WriteLine("excute a refered commmand : {0}", strCmd);
110
}
111
else
112
Console.WriteLine("Error: {0}", "Don't get any command");
113
break;
114
}
115![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
116![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
117
// Echo the data back to the client.
118
byte[] msg = Encoding.ASCII.GetBytes("from " + istrLocalHostName);
119![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
120
handler.Send(msg);
121
handler.Shutdown(SocketShutdown.Both);
122
handler.Close();
123
}
124
catch (Exception e)
125
{
126
Console.WriteLine(e.ToString());
127![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
128
// Echo the data back to the client.
129
byte[] msg = Encoding.ASCII.GetBytes("Exception:" + e.Message);
130![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
131
handler.Send(msg);
132
handler.Shutdown(SocketShutdown.Both);
133
handler.Close();
134![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
135
}
136
}
137![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
138
}
139
catch (Exception e)
140
{
141
Console.WriteLine(e.ToString());
142
}
143![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
144
Console.WriteLine("\nPress ENTER to continue
");
145
Console.Read();
146![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
147
}
148![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
149
public static int Main(String[] args)
150
{
151
StartListening();
152
return 0;
153
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
40
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
42
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
43
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
44
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
45
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
46
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
47
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
48
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
50
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
51
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
52
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
53
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
54
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
55
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
56
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
57
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
58
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
59
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
60
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
61
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
62
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
63
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
64
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
65
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
66
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
67
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
68
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
69
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
70
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
71
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
72
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
73
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
74
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
75
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
76
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
77
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
78
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
79
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
80
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
81
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
82
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
83
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
84
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
85
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
86
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
87
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
88
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
89
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
90
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
91
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
92
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
93
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
94
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
95
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
96
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
97
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
98
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
99
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
100
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
101
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
102
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
103
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
104
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
105
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
106
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
107
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
108
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
109
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
110
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
111
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
112
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
113
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
114
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
115
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
116
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
117
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
118
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
119
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
120
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
121
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
122
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
123
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
124
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
125
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
126
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
127
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
128
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
129
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
130
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
131
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
132
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
133
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
134
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
135
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
136
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
137
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
138
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
139
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
140
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
141
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
142
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
143
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
144
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
145
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
146
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
147
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
148
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
149
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
150
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
151
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
152
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
153
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
调用client side的批处理
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)