A simple control and client
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; using System.Configuration; using System.Reflection; using Common.MySocket; namespace ControlCenter { class Program { public static Dictionary<string, Socket> socketDC = new Dictionary<string, Socket>(); public static Dictionary<string, bool> sendFlag = new Dictionary<string, bool>(); public static Dictionary<string, bool> recvFlag = new Dictionary<string, bool>(); //client is ok or not public static Dictionary<string, bool> clientflag = new Dictionary<string, bool>(); private static byte[] result = new byte[1024]; //private static Queue<String> myQueue = new Queue<String>(); static List<string> commands = new List<string>(); static List<string> innercommands = new List<string>(); //do command(such as listcase, listtask) static bool IsCommand = false; static int MAXSPAN = 60000; static ServerSocket ssocket; static volatile bool DoingFlag = false; //process log static List<string> logDC = new List<string>(); static void Main(string[] args) { //init socket and command Init(); //start a thread ,accept new connection Thread myThread = new Thread(ListenClientConnect); myThread.IsBackground = true; myThread.Start(); //now wait for commands Console.WriteLine("please input your command :"); string[] inputcommands; int mycount = 1; while (true) { //read from keyboard mycount = 1; string mycommand = Console.ReadLine(); if (mycommand.Contains(':')) { inputcommands = mycommand.Split(':'); mycommand = inputcommands[0]; mycount = int.Parse(inputcommands[1]); } mycommand = mycommand.ToUpper(); //command exit, exit main thread,end program if (mycommand == "EXIT") { CloseClients(); break; } //heartbeat packet, test clients is ok or not, if ok, set it to clientflag SendHelloMessage("HELLO"); //process inner commands bool IsInnerCmd = ProcessInnerCommand(mycommand); //Determine whether there exists clients if (clientflag.Count > 0 ) { //not inner command,such (exit,list etc.), we need send it to clients if (!IsInnerCmd) { //send the command, let test clients prepare well IsCommand = false; //is the command in our command list? foreach (var command in commands) { if (command.ToUpper() == mycommand) { IsCommand = true; //there is flag for doing if (!DoingFlag) { DoingFlag = true; int sendCount = 0; if (mycount > 0) { sendCount = SendCommand(command+":"+mycount); } else { sendCount = SendCommand(command); } int recvConut = RecveResponseCommand(); if (recvConut != sendCount) { Console.WriteLine("recvcount:{0}-----sendcount:{1}", recvConut, sendCount); } //after prepare well(send back the result), send start command sendCount = SendCommand("START"); Console.WriteLine("Start test "); //start a new thread to receive response result, do not block main block Thread receiveThread = new Thread(RecvResult); receiveThread.IsBackground = true; receiveThread.Start(); } } } if (!IsCommand) { Console.WriteLine("the command {0} is not in the command list, please check your configure", mycommand); } } } else { Console.WriteLine("There are no connected clients, please start clients-- clientflag.Count {0}", clientflag.Count); } } } private static bool Init() { IPAddress ServerIP = null ; int ServerPort; int QueueNum; #region get ip //get ip, if not set default try { ServerIP = IPAddress.Parse(ConfigurationManager.AppSettings["ServerIP"]); } catch (Exception ex) { Console.WriteLine("Server IP is wrong {0}", ex.Message); } if (ServerIP == null) { ServerIP = IPAddress.Parse("172.16.73.127"); } #endregion #region get port //get port,if not set default try { ServerPort = int.Parse(ConfigurationManager.AppSettings["ServerPort"]); if (ServerPort > 65536 || ServerPort <= 1024) { ServerPort = 8888; } } catch (Exception ex) { Console.WriteLine("Server port is wrong {0}", ex.Message); ServerPort = 8888; } #endregion #region get queue number try { QueueNum = int.Parse(ConfigurationManager.AppSettings["QueueNum"]); if (QueueNum > 10000 || QueueNum < 1000) { QueueNum = 5000; } } catch (Exception ex) { Console.WriteLine("Queue number is not set {0}", ex.Message); QueueNum = 5000; } #endregion //start socket try { ssocket = new ServerSocket(ServerIP, ServerPort); ssocket.Init(QueueNum); } catch (Exception ex) { Console.WriteLine("Error message : {0}",ex.Message); return false; } //init comand list int count = InitCommand(); if (count == 0) { Console.WriteLine("There are no commands"); return false; } return true; } private static int InitCommand() { try { commands = ConfigurationManager.AppSettings["Commands"].Split(',').ToList<string>(); //foreach (var command in commands) //{ // Console.WriteLine("command : {0}", command); //} return commands.Count; } catch (Exception ex) { Console.WriteLine("init command exception : ", ex.Message); return commands.Count; } } private static void ListenClientConnect() { while (true) { Socket scsocket = ssocket.AcceptSocket(); Console.WriteLine("remote point {0}--- local point:{1} ", scsocket.RemoteEndPoint.ToString(), scsocket.LocalEndPoint.ToString()); socketDC.Add(scsocket.RemoteEndPoint.ToString(), scsocket); } } private static bool ProcessInnerCommand(string mycommand) { bool IsInnerFlag = false; //list all connections if (mycommand == "LIST") { IsInnerFlag = true; ShowConnectList(); } //list all commands else if (mycommand == "COMMAND") { IsInnerFlag = true; ShowComamndList(); } //close all clients else if (mycommand == "END" || mycommand =="CLOSE") { IsInnerFlag = true; CloseClients(); } else if (mycommand == "CALC") { CalcResult(); IsInnerFlag = true; } return IsInnerFlag; } private static void ShowConnectList() { foreach (var obj in socketDC) { if (clientflag.ContainsKey(obj.Key)) { Console.WriteLine("{0}:{1}", obj.Key, obj.Value); } } } private static void SendHelloMessage(String hello) { List<string> allkeys = new List<string>(socketDC.Keys); if (allkeys.Count == 0) { Console.WriteLine("There are no connected clients, please start clients"); return; } clientflag.Clear(); foreach (var key in allkeys) { // Console.WriteLine("keys :{0}:{1}", key, socketDC[key]); try { if (socketDC[key].Connected) { socketDC[key].Send(Encoding.ASCII.GetBytes(hello)); int receiveNumber = socketDC[key].Receive(result); if (receiveNumber > 0) { String str = Encoding.ASCII.GetString(result, 0, receiveNumber); clientflag.Add(key,true); Console.WriteLine("222 receive hello message::{0} from {1}", str,key); } } } catch (Exception ex) { Console.WriteLine("::{0}", ex.Message); if (socketDC[key].Connected) { socketDC[key].Shutdown(SocketShutdown.Both); socketDC[key].Close(); } socketDC.Remove(key); } } } private static int SendCommand(string command) { List<string> allkeys = new List<string>(socketDC.Keys); sendFlag.Clear(); foreach (var key in allkeys) { //Console.WriteLine("keys :{0}:{1}", key, socketDC[key]); try { if (socketDC[key].Connected) { socketDC[key].Send(Encoding.ASCII.GetBytes(command)); sendFlag.Add(key, true); } } catch (Exception ex) { Console.WriteLine("::{0}", ex.Message); if (socketDC[key].Connected) { socketDC[key].Shutdown(SocketShutdown.Both); socketDC[key].Close(); } socketDC.Remove(key); } } return sendFlag.Count; } private static int RecveResponseCommand() { recvFlag.Clear(); //Set the timeout time DateTime dt = DateTime.Now; while (true) { Thread.Sleep(20); List<string> allkeys = new List<string>(sendFlag.Keys); if (sendFlag.Count != 0) { foreach (var key in allkeys) { try { if (socketDC[key].Connected) { Array.Clear(result, 0, result.Length); int receiveNumber = socketDC[key].Receive(result); if (receiveNumber > 0) { String str = Encoding.ASCII.GetString(result, 0, receiveNumber); recvFlag.Add(key, true); sendFlag.Remove(key); Console.WriteLine("111 receive response message::{0}", str); } } } catch (Exception ex) { Console.WriteLine("::{0}", ex.Message); if (socketDC[key].Connected) { socketDC[key].Shutdown(SocketShutdown.Both); socketDC[key].Close(); } socketDC.Remove(key); sendFlag.Remove(key); } } } else { break; } TimeSpan ts = DateTime.Now - dt; if (ts.TotalMilliseconds > MAXSPAN) { Console.WriteLine("timespan :: {0}", ts.TotalMilliseconds); break; } } return recvFlag.Count; } private static void RecvResult() { int totalsocket = sendFlag.Count; List<Socket> allsockets = new List<Socket>(); List<Socket> temp ; logDC.Clear(); foreach (var key in sendFlag.Keys) { allsockets.Add(socketDC[key]); } while (true) { temp = new List<Socket>(allsockets); try { if (totalsocket > 0) { Socket.Select(temp, null, null, 1000); int count = temp.Count; for (int i = 0; i < count; i++) { int receiveNumber = temp[i].Receive(result); if (receiveNumber > 0) { String str = Encoding.ASCII.GetString(result, 0, receiveNumber); logDC.Add(str); Console.WriteLine("result 4444 :: receive response message::{0}", str); } else { temp[i].Shutdown(SocketShutdown.Both); temp[i].Close(); allsockets.Remove(temp[i]); Console.WriteLine("result:: error::{0}"); } totalsocket--; } } else { DoingFlag = false; break; } } catch (Exception ex) { Console.WriteLine("last ::{0}", ex.Message); Thread.Sleep(1000); } } } private static void CloseClients() { foreach (var obj in socketDC) { if (clientflag.ContainsKey(obj.Key) && obj.Value.Connected) { Console.WriteLine("{0}:{1}", obj.Key, obj.Value); obj.Value.Send(Encoding.ASCII.GetBytes("CLOSE")); obj.Value.Shutdown(SocketShutdown.Both); obj.Value.Close(); } } } private static void ShowComamndList() { foreach (var obj in commands) { Console.WriteLine("{0}", obj); } } private static void CalcResult() { if (logDC.Count > 0) { string[] strs = null; double everytime = 0; foreach (var log in logDC) { strs = log.Split(','); Console.WriteLine("client ip:{0}, total send :{1}, total time:{2}", strs[0], strs[1], strs[2]); int count = int.Parse(strs[1]); long time = long.Parse(strs[2]); if (count > 0) { everytime += count / (time / 1000.0); } } Console.WriteLine("Every time : {0} ", everytime); } else { Console.WriteLine("no log "); } } } }
clietn :
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using System.Reflection; namespace ClientRunner { class Program { private static byte[] result = new byte[1024]; static volatile bool startFlag = false; static void Main(string[] args) { Socket clientSocket; try { IPAddress ip = IPAddress.Parse("127.0.0.1"); int port = 8888; clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(new IPEndPoint(ip, 8888)); Console.WriteLine("connect ip:{0}--port:{1} success, myself is {2}", ip, port, clientSocket.LocalEndPoint.ToString()); } catch (Exception ex) { Console.WriteLine("failure! : {0}", ex.Message); return; } Thread receiveThread = new Thread(ReceiveMessage); //receiveThread.IsBackground = true; receiveThread.Start(clientSocket); } private static void ReceiveMessage(object clientSocket) { Socket myClientSocket = (Socket)clientSocket; while (true) { try { int receiveNumber = myClientSocket.Receive(result); if (receiveNumber > 0) { String str = Encoding.ASCII.GetString(result, 0, receiveNumber); Console.WriteLine("receive {0} message {1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber)); if (str == "CLOSE") { break; } ProcesMessage(clientSocket, str); } } catch (Exception ex) { Console.WriteLine("receive :" + ex.Message); if (myClientSocket.Connected) { myClientSocket.Shutdown(SocketShutdown.Both); myClientSocket.Close(); } break; } } } private static void SendMessage(object clientSocket) { Socket myClientSocket = (Socket)clientSocket; int totalsend = 0; while (true) { try { for (int i = 0; i < 10; i++) { Thread.Sleep(1000); string sendMessage = " client send Message Hellp-- " + i; myClientSocket.Send(Encoding.ASCII.GetBytes(sendMessage)); Console.WriteLine("send message to server:{0}", i); totalsend++; } } catch (Exception ex) { Console.WriteLine("send :" + ex.Message); Console.WriteLine("total send count :" + totalsend); if (myClientSocket.Connected) { myClientSocket.Shutdown(SocketShutdown.Both); myClientSocket.Close(); } break; } } } private static void ProcesMessage(object clientSocket, string str) { try { Socket myClientSocket = (Socket)clientSocket; //start command , set start flag true if (str == "START") { startFlag = true; } else if (str == "HELLO") { myClientSocket.Send(Encoding.ASCII.GetBytes("I am ok ")); } else // other command { //first test the command exist or not string cmd; if (str.Contains(":")) { string[] inputcommands = str.Split(':'); cmd = inputcommands[0]; } else { cmd = str; } Type testType = Type.GetType("ClientRunner." + cmd); if (testType != null) { //if exist, start a thread do the command Thread docommand = new Thread(DoComand); docommand.IsBackground = true; ParameterOBJ pj = new ParameterOBJ(); pj.sc = myClientSocket; pj.str = str; docommand.Start(pj); } else //if command not exist, send error to control center { myClientSocket.Send(Encoding.ASCII.GetBytes("i don't know the command ")); } } } catch (Exception ex) { Console.WriteLine("process mesage send :" + ex.Message); } } private static void DoComand(object pj) { string mystr; Socket sc =null; string str; try { //use Reflection get class instance var mypj = (ParameterOBJ)pj; str = mypj.str; sc = mypj.sc; int testcount; if (str.Contains(":")) { string[] inputcommands = str.Split(':'); mystr = inputcommands[0]; testcount = int.Parse(inputcommands[1]); } else { mystr = str; //default test one time testcount = 1; } Type myType = Type.GetType("ClientRunner." + mystr); var obj = (ICommand)Activator.CreateInstance(myType); bool mybl = (bool)obj.Prepare(mystr,testcount); if (mybl) { sc.Send(Encoding.ASCII.GetBytes("prepare is on ")); } else { sc.Send(Encoding.ASCII.GetBytes("prepare is failure,client close connect and exit ")); if (sc != null && sc.Connected) { sc.Shutdown(SocketShutdown.Both); sc.Close(); } } //wait for start command while (true) { Thread.Sleep(100); if (startFlag) { Console.WriteLine("start flag is true"); break; } } string result = (string) obj.Do(mystr,sc,testcount); //send back the result sc.Send(Encoding.ASCII.GetBytes(result)); } catch (Exception ex) { //send response i don't know the command? Console.WriteLine("::do command exception {0}", ex.Message); if (sc != null && sc.Connected) { sc.Shutdown(SocketShutdown.Both); sc.Close(); } } } } }
using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Threading; namespace ClientRunner { class ParameterOBJ { public Socket sc; public string str; } }
using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Net; using System.Diagnostics; namespace ClientRunner { public interface ICommand { //Object Do(Dictionary<string, Socket> socketDC, string message); Object Do(string message,Socket sc,int count); Object Prepare(string message,int count); } }
socket class :
using System; using System.Collections.Generic; using System.Net.Sockets; using System.Net; using System.Text; namespace Common.MySocket { public class BaseSocket { byte[] buffer = new byte[1024]; protected Socket _mysocket; protected IPAddress _ip; protected int _port; public BaseSocket(IPAddress ip, int port) { _ip = ip; _port = port; } public void SendMessage(Socket mysocket, string sendmessage) { try { if (mysocket.Connected) { mysocket.Send(Encoding.ASCII.GetBytes(sendmessage)); } } catch (Exception ex) { Console.WriteLine("::{0}", ex.Message); if (mysocket.Connected) { mysocket.Shutdown(SocketShutdown.Both); mysocket.Close(); } //let outside know what exception happen throw ex; } } public string RecvMessage(Socket mysocket) { try { if (mysocket.Connected) { int receiveNumber = mysocket.Receive(buffer); if (receiveNumber > 0) { String str = Encoding.ASCII.GetString(buffer, 0, receiveNumber); Console.WriteLine("result:: receive response message::{0}", str); return str; } } } catch (Exception ex) { Console.WriteLine("::{0}", ex.Message); if (mysocket.Connected) { mysocket.Shutdown(SocketShutdown.Both); mysocket.Close(); } throw ex; } return null; } public void ClearBuffer() { Array.Clear(buffer, 0, buffer.Length); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; namespace Common.MySocket { public class ClientSocket : BaseSocket { public ClientSocket(IPAddress ip, int port) : base(ip, port) { } public bool Connect() { _mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { _mysocket.Connect(new IPEndPoint(_ip, _port)); Console.WriteLine("sucess"); } catch (Exception ex) { Console.WriteLine("failure! : {0}", ex.Message); return false; } return true; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; namespace Common.MySocket { public class ServerSocket : BaseSocket { public ServerSocket(IPAddress ip, int port) : base(ip, port) { } public void Init(int queueNum) { try { _mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _mysocket.Bind(new IPEndPoint(_ip, _port)); _mysocket.Listen(queueNum); Console.WriteLine("start {0} success", _mysocket.LocalEndPoint.ToString()); } catch (Exception ex) { Console.WriteLine("Can't start socket connect {0}", ex.Message); throw ex; } } public Socket AcceptSocket() { return _mysocket.Accept(); } } }
config :
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ServerIP" value="127.0.0.1"/> <add key="ServerPort" value="8888"/> <add key="QueueNum" value="5000"/> <add key ="Commands" value="Getx,GetxClear" /> </appSettings> </configuration>