// アクセプト private void acceptTcpConnection(object e) { // if (this.isAct) { TcpClient client = this.listener_.AcceptTcpClient(); // create tcp connecton NetWorkContoroller dataSender = new NetWorkContoroller(client); System.Threading.ThreadPool.QueueUserWorkItem(acceptTcpConnection); lock (((ICollection)this.dataSenderList).SyncRoot) { // 新規コネクションに対してキャッシュデータの送信 List <DataObject> cacheData = this.dataCache.getAllDataList(); foreach (DataObject data in cacheData) { // データの送信 dataSender.setSndMessage(data); } // 送信先リストに追加 this.dataSenderList.Add(dataSender); } } }
public ServerNodeManager(List <ConnectionInfo> connectList) //List<string> connectList) { this.serverList = new List <NetWorkContoroller>(); //this.actConnectList = new List<ConnectionInfo>(); this.serverStatus = new ConcurrentDictionary <string, ServerStatus>(); this.finishKetList = new List <int>(); this.connctToInfo = new ConcurrentDictionary <string, int>(); Parallel.ForEach(connectList, conectInf => { //string[] conInfList = conectInf.Split(':'); string ip = conectInf.ip; //conInfList[0]; int port = conectInf.managerPort; //Int32.Parse(conInfList[1]); // サーバへ接続 NetWorkContoroller serverConnection = connectToServer(ip, port); if (serverConnection.getStatus()) { this.serverList.Add(serverConnection); // サーバのコネクション先を格納 this.connctToInfo.TryAdd(ip + ':' + port, conectInf.serverPort); //this.actConnectList.Add(conectInf); } }); // サーバ間のコネクション確立 //==> 0番目(head node)には接続情報を送らないため「i > 0」を設定 for (int i = this.serverList.Count - 1; i > 0; i--) { string connectionInfo = createConnection(i); if (connectionInfo != null) { DataObject data = new DataObject(MessageTypeEnum.ConnectInf, connectionInfo); this.serverList[i].setSndMessage(data); ServerStatus tmpSvStat = new ServerStatus(connectionInfo); string svStatKey = this.serverList[i].getIp() + ":" + this.serverList[i].getPort(); //string svStatKey = this.actConnectList[i].ip + ":" + this.actConnectList[i].serverPort; this.serverStatus.TryAdd(svStatKey, tmpSvStat); } } // 最終データ取得用メッセージ getFinalTransferInfoRequest(); System.Threading.ThreadPool.QueueUserWorkItem(checkConnectionThread); System.Threading.ThreadPool.QueueUserWorkItem(dataRecievThread); }
// マネージャプロセウスの接続 private void acceptManagemet(object e) { TcpClient client = this.listener_.AcceptTcpClient(); Console.WriteLine("manager process connected"); NetWorkContoroller managent = new NetWorkContoroller(client); System.Threading.ThreadPool.QueueUserWorkItem(acceptManagemet); lock (((ICollection)this.managentList).SyncRoot) { this.managentList.Add(managent); } }
// クライアント接続の受け入れ private void acceptTcpConnection(object e) { TcpClient client = this.listener_.AcceptTcpClient(); System.Threading.ThreadPool.QueueUserWorkItem(acceptTcpConnection); Console.WriteLine("client connet"); // create tcp connecton NetWorkContoroller master = new NetWorkContoroller(client); int key = master.getPort(); string ip = master.getIp(); List <NetWorkContoroller> tcplist = new List <NetWorkContoroller>(); // 複数コネクションを作成 while (true) { // Console.WriteLine("wait get connection list "); DataObject data = master.getRcvMessage(); if (data != null) { Console.WriteLine(data.messageType + " / " + data.dataStr); foreach (string portStr in data.dataStr.Split(',')) { Console.WriteLine("port --> " + portStr); int port = Int32.Parse(portStr); Console.WriteLine("master ; " + ip + ":" + key + " / conntect to " + ip + ":" + port); TcpClient tcp = new TcpClient(ip, port); tcplist.Add(new NetWorkContoroller(tcp)); } break; } System.Threading.Thread.Sleep(1); //tcplist.Add } this.clientList.TryAdd(key, tcplist); System.Threading.ThreadPool.QueueUserWorkItem(dataReceverThread, key); }
public ServerComunicationManager(DataReceiverController receiver, string ip, int port) { this.isAct = true; this.receiver = receiver; for (int i = 0; i < 10; i++) { try { Console.WriteLine("conntect to " + ip + ":" + port); TcpClient tcp = new TcpClient(ip, port); this.tcpClient = new NetWorkContoroller(tcp); this.dataReceiveThread = new System.Threading.Thread(dataReceivThreadAction); this.dataReceiveThread.Start(); } catch { this.isAct = false; System.Threading.Thread.Sleep(1000); Console.WriteLine("connction filed"); } } }
// マネージャからサーバへの接続 private NetWorkContoroller connectToServer(string ip, int port) { NetWorkContoroller serverConnection = null; // リトライ for (int i = 0; i < this.retryCnt; i++) { try { Console.WriteLine("connection to. count --> " + i + 1 + "/" + retryCnt); TcpClient tcp = new TcpClient(ip, port); serverConnection = new NetWorkContoroller(tcp); break; } catch { Console.WriteLine("connection error. retry count: " + i + 1 + "/" + retryCnt); } System.Threading.Thread.Sleep(1000); } return(serverConnection); }
//int portCnt, string ip, int port, DataObject[] splitFileList) //this.portCnt = portCnt; //this.ip = ip; //this.port = port; // = "127.0.0.1"; //int port = 6001; /* * System.Threading.ThreadPool.QueueUserWorkItem(runServerConnectionThread); * } * * private void runServerConnectionThread(object e) * { * DataObject[] splitFileList = e as DataObject[]; * * this.isRuning = true; */ public bool run(int portCnt, string ip, int port, DataObject[] splitFileList) { bool status = true; // サーバへの接続 try { Console.WriteLine("conntect to " + ip + ":" + port); TcpClient tcp = new TcpClient(ip, port); NetWorkContoroller masterConnection = new NetWorkContoroller(tcp); Console.WriteLine("connected"); // コネクション用ポートの開始 this.opnPortList = new int[portCnt]; this.tcpList = new NetWorkContoroller[portCnt]; for (int i = 0; i < portCnt; i++) { System.Threading.ThreadPool.QueueUserWorkItem(startMultiConnection, i); } // 解放されたポートを取得 string portList = getStartPortList(portCnt); Console.WriteLine("port data list : " + portList); DataObject data = new DataObject(MessageTypeEnum.ConnectList, portList); masterConnection.setSndMessage(data); connectionStartCheck(portCnt); // データの送信 int num = 0; lock (((ICollection)this.opnPortList).SyncRoot) { foreach (DataObject sendData in splitFileList) { tcpList[num % portCnt].setSndMessage(sendData); num++; } } DataObject fileFinish = new DataObject(MessageTypeEnum.FileFinish, 0); //num++; tcpList[num % portCnt].setSndMessage(fileFinish); // 接続待ち(サーバから複数接続) disconnectionStartCheck(); // 終了まち・タイムアウト設定 Console.WriteLine("file transfer compleat"); } catch (Exception E) { Console.WriteLine("Error no connection " + E.ToString()); } return(status); //this.isRuning = false; }