最近的项目中遇到了,使用多台服务器,多个客户端来运行一个分布式存储、计算应用程序。总是打开远程连接太过于麻烦且网速慢的原因,所以写一个的调度的程序。
情况如下:
环境: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![]()
5
// Data buffer for incoming data.
6
byte[] bytes = new byte[1024];
7![]()
8
// Connect to a remote device.
9
try
10
{
11![]()
12
IPHostEntry ipHostInfo = null;
13
List<IPAddress> iplist = new List<IPAddress>();
14![]()
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![]()
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![]()
30
// Create a TCP/IP socket.
31
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
32![]()
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![]()
38
// Send the data through the socket.
39
int bytesSent = sender.Send(msg);
40![]()
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![]()
45
// Release the socket.
46
sender.Shutdown(SocketShutdown.Both);
47
sender.Close();
48![]()
49
Console.WriteLine("successful!");
50
Console.WriteLine("");
51![]()
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![]()
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![]()
75
}
76
catch (Exception e)
77
{
78
Console.WriteLine(e.ToString());
79
}
80
}
81
static InputArgs TArgs = new InputArgs();
82![]()
83
public static int Main(String[] args)
84
{
85
if (!Parser.ParseArgumentsWithUsage(args, TArgs))
86
{
87
return 0;
88
}
89![]()
90
StartClient();
91
return 0;
public static void StartClient()2
{3
string strParamater = TArgs.MachineList + ";" + TArgs.CommandName + ";" + TArgs.ProcessName + ";" + TArgs.ProgramPath;4

5
// Data buffer for incoming data.6
byte[] bytes = new byte[1024];7

8
// Connect to a remote device.9
try10
{11

12
IPHostEntry ipHostInfo = null;13
List<IPAddress> iplist = new List<IPAddress>();14

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

23
for (int i = 0; i < iplist.Count; i++)24
{25
// Connect the socket to the remote endpoint. Catch any errors.26
try27
{28
Console.WriteLine("Socket connected to {0}", iArrHostName[i].ToString());29

30
// Create a TCP/IP socket.31
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);32

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

38
// Send the data through the socket.39
int bytesSent = sender.Send(msg);40

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

45
// Release the socket.46
sender.Shutdown(SocketShutdown.Both);47
sender.Close();48

49
Console.WriteLine("successful!");50
Console.WriteLine("");51

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

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

75
}76
catch (Exception e)77
{78
Console.WriteLine(e.ToString());79
}80
}81
static InputArgs TArgs = new InputArgs();82

83
public static int Main(String[] args)84
{85
if (!Parser.ParseArgumentsWithUsage(args, TArgs))86
{87
return 0;88
}89

90
StartClient();91
return 0;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![]()
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![]()
9
[Argument(ArgumentType.AtMostOnce, LongName = "ProcessName", ShortName = "PN", HelpText = "process name,which need to kill")]
10
public string ProcessName = string.Empty;
11![]()
12
[Argument(ArgumentType.AtMostOnce, LongName = "ProgramPath", ShortName = "PP", HelpText = "program path which need to start")]
13
public string ProgramPath = string.Empty;
14![]()
15
16
}
class InputArgs2
{3
[Argument(ArgumentType.Required, LongName = "MachineList", ShortName = "ML", HelpText = "machine list,such as server1,server2")]4
public string MachineList = string.Empty;5

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

9
[Argument(ArgumentType.AtMostOnce, LongName = "ProcessName", ShortName = "PN", HelpText = "process name,which need to kill")]10
public string ProcessName = string.Empty;11

12
[Argument(ArgumentType.AtMostOnce, LongName = "ProgramPath", ShortName = "PP", HelpText = "program path which need to start")]13
public string ProgramPath = string.Empty;14

15
16
}
Server side代码:
1
// Incoming data from the client.
2
public static string data = null;
3![]()
4
public static void StartListening()
5
{
6
// Data buffer for incoming data.
7
byte[] bytes = new Byte[1024];
8![]()
9
IPAddress ipAddress = IPAddress.Any;
10
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
11![]()
12
// Create a TCP/IP socket.
13
Socket listener = new Socket(AddressFamily.InterNetwork,
14
SocketType.Stream, ProtocolType.Tcp);
15![]()
16
string istrLocalHostName = string.Empty;
17
Socket handler = null;
18![]()
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![]()
26
// Start listening for connections.
27
while (true)
28
{
29
try
30
{
31![]()
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![]()
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![]()
49
if (data != null)
50
data = data.Replace("<EOF>", "");
51![]()
52
//information(machine list,command)
53
istrLocalHostName = Dns.GetHostName();
54
string[] strArrMachineList = data.Split(';')[0].Split(',');
55![]()
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![]()
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![]()
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![]()
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![]()
116![]()
117
// Echo the data back to the client.
118
byte[] msg = Encoding.ASCII.GetBytes("from " + istrLocalHostName);
119![]()
120
handler.Send(msg);
121
handler.Shutdown(SocketShutdown.Both);
122
handler.Close();
123
}
124
catch (Exception e)
125
{
126
Console.WriteLine(e.ToString());
127![]()
128
// Echo the data back to the client.
129
byte[] msg = Encoding.ASCII.GetBytes("Exception:" + e.Message);
130![]()
131
handler.Send(msg);
132
handler.Shutdown(SocketShutdown.Both);
133
handler.Close();
134![]()
135
}
136
}
137![]()
138
}
139
catch (Exception e)
140
{
141
Console.WriteLine(e.ToString());
142
}
143![]()
144
Console.WriteLine("\nPress ENTER to continue
");
145
Console.Read();
146![]()
147
}
148![]()
149
public static int Main(String[] args)
150
{
151
StartListening();
152
return 0;
153
}
// Incoming data from the client.2
public static string data = null;3

4
public static void StartListening()5
{6
// Data buffer for incoming data.7
byte[] bytes = new Byte[1024];8

9
IPAddress ipAddress = IPAddress.Any; 10
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);11

12
// Create a TCP/IP socket.13
Socket listener = new Socket(AddressFamily.InterNetwork,14
SocketType.Stream, ProtocolType.Tcp);15

16
string istrLocalHostName = string.Empty;17
Socket handler = null; 18

19
// Bind the socket to the local endpoint and 20
// listen for incoming connections.21
try22
{23
listener.Bind(localEndPoint);24
listener.Listen(10);25

26
// Start listening for connections.27
while (true)28
{29
try30
{31

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

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

49
if (data != null)50
data = data.Replace("<EOF>", "");51

52
//information(machine list,command)53
istrLocalHostName = Dns.GetHostName();54
string[] strArrMachineList = data.Split(';')[0].Split(',');55

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

69
//Handle the command70
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

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

105
default:106
if (data != null)107
{108
Process.Start(data);109
Console.WriteLine("excute a refered commmand : {0}", strCmd);110
}111
else112
Console.WriteLine("Error: {0}", "Don't get any command");113
break;114
}115

116

117
// Echo the data back to the client.118
byte[] msg = Encoding.ASCII.GetBytes("from " + istrLocalHostName);119

120
handler.Send(msg);121
handler.Shutdown(SocketShutdown.Both);122
handler.Close();123
}124
catch (Exception e)125
{126
Console.WriteLine(e.ToString());127

128
// Echo the data back to the client.129
byte[] msg = Encoding.ASCII.GetBytes("Exception:" + e.Message);130

131
handler.Send(msg);132
handler.Shutdown(SocketShutdown.Both);133
handler.Close();134

135
}136
}137

138
}139
catch (Exception e)140
{141
Console.WriteLine(e.ToString());142
}143

144
Console.WriteLine("\nPress ENTER to continue
");145
Console.Read();146

147
}148

149
public static int Main(String[] args)150
{151
StartListening();152
return 0;153
}
调用client side的批处理

浙公网安备 33010602011771号