/// <summary> /// Конструктор клиентской части /// </summary> /// <param name="readerPortName">Имя считываюшего порта</param> /// <param name="writerPortName">Имя порта для записи</param> /// <param name="id">Идентификатор клиента</param> /// <param name="portSpeed">Скорость портов</param> public CommunicationUnit(string readerPortName,string writerPortName, byte id, int portSpeed) { _readPorts = new SerialPort[1]; _readPorts[0] = new SerialPort(); _readPorts[0].PortName = readerPortName; _readPorts[0].BaudRate = portSpeed; _readPorts[0].Parity = Parity.None; _readPorts[0].DataBits = 8; _readPorts[0].StopBits = StopBits.One; _readPorts[0].Handshake = Handshake.None; _readPorts[0].ReadTimeout = 500; _readPorts[0].WriteTimeout = 500; _readPorts[0].WriteBufferSize = 65000; _readPorts[0].ReadBufferSize = 65000; _readPorts[0].ReadTimeout = 5000; _comPortWriter = new SerialPort(); _comPortWriter.PortName = writerPortName; _comPortWriter.BaudRate = portSpeed; _comPortWriter.Parity = Parity.None; _comPortWriter.DataBits = 8; _comPortWriter.StopBits = StopBits.One; _comPortWriter.Handshake = Handshake.None; _comPortWriter.ReadTimeout = 500; _comPortWriter.WriteTimeout = 500; _comPortWriter.WriteBufferSize = 65000; _comPortWriter.ReadBufferSize = 65000; // Особая уличная кодировка для правильной отправки байтов чьё значение больше 127-ми _readPorts[0].Encoding = Encoding.GetEncoding(28591); _comPortWriter.Encoding = Encoding.GetEncoding(28591); ProcessedFileSize = 0; IsRecivingFile = false; ClietnId = id; Client.Continue = true; // Добавление клиента "Сервер" с id 0 для получения информации для инициализации и дальнейших коммуникаций _clientArray.Add(0, new Client((byte)0, ClietnId, _outMessageQueueSize, _comPortWriter)); ReOpenPort(_readPorts[0]); ReOpenPort(_comPortWriter); _selfCheckingThread = new Thread(SelfChecking); _selfCheckingThread.Start(); // Отправка запроса на инициализацию SendInitializationRequest(); var initData = ReadInitialization(_readPorts[0]); _broadcastManager = new BroadcastManager(initData.EnabledClients.Length); _enabledClientIDs = initData.EnabledClients; ClientNames = initData.Names; // Подписывает на события от сервера _clientArray[0].AcknowledgeRecived += new EventHandler<MessageRecivedEventArgs>(ClientAcknowledgeRecived); _clientArray[0].AcknowledgeRecived += new EventHandler<MessageRecivedEventArgs>(_broadcastManager.ReceiveAcknowledge); SetSystemDateTime(initData.SycDateTime); // Создание объекто для каждого клиента, обхект с номер равным номеру текущего клиента используется для широковещательных сообщений foreach (int client in initData.EnabledClients) { _clientArray.Add(client, new Client((byte)client, ClietnId, _outMessageQueueSize, _comPortWriter)); // Подписывает на события от клиента _clientArray[client].AcknowledgeRecived += new EventHandler<MessageRecivedEventArgs>(ClientAcknowledgeRecived); _clientArray[client].AcknowledgeRecived += new EventHandler<MessageRecivedEventArgs>(_broadcastManager.ReceiveAcknowledge); } //for (int i = 0; i < 5; i++) //{ // // _clientArray[i] = new Client((byte)i,ClietnId, _outMessageQueueSize, _comPortWriter); // _clientArray.Add(i, new Client((byte)i, ClietnId, _outMessageQueueSize, _comPortWriter)); // // // Подписывает на обработку события получения состояния доставки пакета // _clientArray[i].AcknowledgeRecived += // new EventHandler<MessageRecivedEventArgs>(ClientAcknowledgeRecived); // // _clientArray[i].AcknowledgeRecived += // new EventHandler<MessageRecivedEventArgs>(_broadcastManager.ReceiveAcknowledge); //} _waitFileTransferAnswerTimer = new Timer(WaitFileAnswerTransfer); _readThread = new Thread(Read); _readThread.Start(_readPorts[0]); }
// TODO Убрать возможность определять ID для сервера сделать его всегда 0 /// <summary> /// Конструктор серверной части /// </summary> /// <param name="readerPortName1">Имя первого считываюшего порта </param> /// <param name="readerPortName2">Имя второго считываюшего порта</param> /// <param name="readerPortName3">Имя третьего считываюшего порта</param> /// <param name="readerPortName4">Имя четвертого считываюшего порта</param> /// <param name="writerPortName">Имя порта для записи</param> /// <param name="id">Идентификатор сервера, необходимо установить 0</param> /// <param name="portSpeed">Скорость портов</param> /// <param name="enabledClientIDs">ID достуаных клиентов</param> public CommunicationUnit(string readerPortName1, string readerPortName2, string readerPortName3, string readerPortName4, string writerPortName, byte id, int portSpeed, int[] enabledClientIDs, Dictionary<int, string> names) { _isServer = true; //ClientNames = new Dictionary<int, string>(); //ClientNames = (from x in names // select x).ToDictionary(x => x.Key, x => x.Value); ClientNames = new Dictionary<int, string>(names); _readPorts = new SerialPort[4]; _comPortWriter = new SerialPort(); _comPortWriter.PortName = writerPortName; _comPortWriter.BaudRate = portSpeed; _comPortWriter.Parity = Parity.None; _comPortWriter.DataBits = 8; _comPortWriter.StopBits = StopBits.One; _comPortWriter.Handshake = Handshake.None; _comPortWriter.ReadTimeout = 500; _comPortWriter.WriteTimeout = 500; _comPortWriter.WriteBufferSize = 65000; _comPortWriter.ReadBufferSize = 65000; _comPortWriter.Encoding = Encoding.GetEncoding(28591); ReOpenPort(_comPortWriter); _readPorts[0] = new SerialPort(); _readPorts[0].PortName = readerPortName1; _readPorts[1] = new SerialPort(); _readPorts[1].PortName = readerPortName2; _readPorts[2] = new SerialPort(); _readPorts[2].PortName = readerPortName3; _readPorts[3] = new SerialPort(); _readPorts[3].PortName = readerPortName4; Client.Continue = true; for (int i = 0; i < _readPorts.Length; i++) { _readPorts[i].BaudRate = portSpeed; _readPorts[i].Parity = Parity.None; _readPorts[i].DataBits = 8; _readPorts[i].StopBits = StopBits.One; _readPorts[i].Handshake = Handshake.None; _readPorts[i].ReadTimeout = 500; _readPorts[i].WriteTimeout = 500; _readPorts[i].WriteBufferSize = 65000; _readPorts[i].ReadBufferSize = 65000; _readPorts[i].ReadTimeout = 5000; _readPorts[i].Encoding = Encoding.GetEncoding(28591); ReOpenPort(_readPorts[i]); _readThread = new Thread(Read); _readThread.Start(_readPorts[i]); } ProcessedFileSize = 0; IsRecivingFile = false; ClietnId = id; // Создание объекто для каждого клиента, обхект с номер равным номеру текущего клиента используется для широковещательных сообщений // for (int i = 0; i < 5; i++) // { // // _clientArray[i] = new Client((byte)i, ClietnId, _outMessageQueueSize, _comPortWriter); // _clientArray.Add(i, new Client((byte)i, ClietnId, _outMessageQueueSize, _comPortWriter)); // // // Подписывает на события от клиента // _clientArray[i].AcknowledgeRecived += // new EventHandler<MessageRecivedEventArgs>(ClientAcknowledgeRecived); // // _clientArray[i].AcknowledgeRecived += // new EventHandler<MessageRecivedEventArgs>(_broadcastManager.ReceiveAcknowledge); // // } _enabledClientIDs = enabledClientIDs; _broadcastManager = new BroadcastManager(enabledClientIDs.Length); foreach (int client in enabledClientIDs) { _clientArray.Add(client, new Client((byte)client, ClietnId, _outMessageQueueSize, _comPortWriter)); // Подписывает на события от клиента _clientArray[client].AcknowledgeRecived += new EventHandler<MessageRecivedEventArgs>(ClientAcknowledgeRecived); _clientArray[client].AcknowledgeRecived += new EventHandler<MessageRecivedEventArgs>(_broadcastManager.ReceiveAcknowledge); } _waitFileTransferAnswerTimer = new Timer(WaitFileAnswerTransfer); _routerQueue = new ConcurrentQueue<Packet.Packet>(); _routerThread = new Thread(Route); _routerThread.Start(); _selfCheckingThread = new Thread(SelfChecking); _selfCheckingThread.Start(); }