Пример #1
0
        // アクセプト
        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);
        }
Пример #7
0
        //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;
        }