Диплом: Автоматизация процесса внутрикорпоративного взаимодействия сотрудников компании РДУСП «Стравита»

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
101
ПРИЛОЖЕНИЕ 2
Рис. П.1. Организационная структура управления РДУСП «Стравита»
102
ПРИЛОЖЕНИЕ 3
Рис. П.1. Программная архитектура РДУСП «Стравита»
103
ПРИЛОЖЕНИЕ 4
Листинг программы
Серверная часть
Модуль serverForm
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Xml;
namespace EPIS.Server
{
public partial class mainForm : Form
{
// Высокоуровневая надстройка для прослушивающего сокета
TcpListener _server;
// Количество принимаемых подключений к серверу
const int MAXNUMCLIENTS = 50;
// Высокоуровневая надстройка для сокетов обмена сообщений с
// клиентскими приложениями.
TcpClient[] clients = new TcpClient[MAXNUMCLIENTS];
// Счетчик подключенных клиентов
int _countClient = 0;
// Флаг для остановки потоков и завершения сетевой работы приложения
bool _stopnetwork;
DataTable path = null;
DataSet ds = null;
public mainForm()
{
StreamReader streamreader = new
StreamReader(Directory.GetCurrentDirectory() + @"\settings.xml",
System.Text.Encoding.UTF8);
ds = new DataSet();
ds.ReadXml(streamreader, XmlReadMode.Auto);
path = ds.Tables[1];
if (File.Exists(path.Rows[0].ItemArray[0].ToString()))
File.Copy(path.Rows[0].ItemArray[0].ToString(),
Directory.GetCurrentDirectory() + @"\measure.mdb", true);
InitializeComponent();
}
#region Методы управления сервером
//Запуск сервера
void StartServer()
{
_server = new TcpListener(IPAddress.Any, 5812);
_server.Start();
104
_stopnetwork = false;
Thread acceptThread = new Thread(AcceptClients);
acceptThread.Start();
activeStatusLabel.Text = "Запущен";
включитьToolStripMenuItem.Enabled = false;
отключитьToolStripMenuItem.Enabled = true;
messTextBox.Enabled = true;
sendButton.Enabled = true;
showMessListBox.Items.Add("[" + DateTime.Now + "] Запуск сервера");
showMessListBox.SelectedIndex = showMessListBox.Items.Count - 1;
showMessListBox.SelectedIndex = -1;
LogingToFile("Запуск сервера");
}
//Остановка сервера
void StopServer()
{
if (_server != null)
{
SendToAll("{O}");
_stopnetwork = true;
_server.Stop();
_server = null;
for (int i = 0; i < MAXNUMCLIENTS; i++)
if (clients[i] != null)
clients[i].Close();
activeStatusLabel.Text = "Остановлен";
включитьToolStripMenuItem.Enabled = true;
отключитьToolStripMenuItem.Enabled = false;
messTextBox.Enabled = false;
sendButton.Enabled = false;
showMessListBox.Items.Add("[" + DateTime.Now + "] Остановка сервера");
showMessListBox.SelectedIndex = showMessListBox.Items.Count - 1;
showMessListBox.SelectedIndex = -1;
clientsList.Items.Clear();
LogingToFile("Остановка сервера");
}
}
#endregion
#region Служебные методы
//Запуск сервера при загрузке приложения
private void mainForm_Load(object sender, EventArgs e)
{
if (!File.Exists(path.Rows[0].ItemArray[0].ToString()))
{
MessageBox.Show("Файл БД не найден. Проверьте путь в БД в файле
конфигурации");
this.Close();
}
else
StartServer();
}
//Остановка сервера до закрытия формы
private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
StopServer();
}
105
//Остановка сервера после закрытия формы (для перестраховки)
private void mainForm_FormClosed(object sender, FormClosedEventArgs e)
{
StopServer();
}
//Открытие формы Мероприятия через меню
private void просмотрToolStripMenuItem_Click(object sender, EventArgs e)
{
measuresForm measuresForm = new measuresForm();
measuresForm.Show();
}
//Рассылка списка мероприятий всем клиентам повторно
private void рассылкаToolStripMenuItem_Click(object sender, EventArgs e)
{
for (int i = 0; i < MAXNUMCLIENTS; i++)
if (clients[i] != null)
SendMeasure(IPToSub(GetIp(i)), i);
}
//Открытие формы Авторизация через меню
private void настройкиToolStripMenuItem_Click(object sender, EventArgs e)
{
loginForm loginForm = new loginForm();
loginForm.Show();
}
//Запуск файла справки
private void справкаToolStripMenuItem_Click(object sender, EventArgs e)
{
Process.Start("Help.chm");
}
//Перезапуск сервера в 20:00 и 12:10
private void timerCheck_Tick(object sender, EventArgs e)
{
if (DateTime.Now.ToLongTimeString() == "20:00:00" ||
DateTime.Now.ToLongTimeString() == "12:10:00")
{
Process.Start("EPIS.Server.exe");
this.Close();
}
}
//Запуск сервера по кнопке в меню
private void включитьToolStripMenuItem_Click(object sender, EventArgs e)
{
StartServer();
}
//Остановка сервера по кнопке в меню
private void отключитьToolStripMenuItem_Click(object sender, EventArgs e)
{
StopServer();
}
//Закрытие приложения через меню
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
//Открытие формы О программе через меню
106
private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)
{
new aboutForm().ShowDialog();
}
//Очистка списка сообщений из контекстного меню
private void очиститьToolStripMenuItem_Click(object sender, EventArgs e)
{
showMessListBox.Items.Clear();
}
//Отправка сообщения по кнопке
private void sendButton_Click(object sender, EventArgs e)
{
if (messTextBox.Text != "")
{
SendToSelected("{S}" + messTextBox.Text);
showMessListBox.Items.Add("[" + DateTime.Now + "] Сервер: " +
messTextBox.Text);
LogingToFile("Сервер: " + messTextBox.Text);
messTextBox.Clear();
}
else
MessageBox.Show("Нельзя отправить пустое сообщение");
}
#endregion
//Метод авторизации ожидающих соединения клиентов (в отдельном потоке)
private void AcceptClients()
{
DataTable dt = null;
try
{
while (true)
{
if (_countClient == MAXNUMCLIENTS || _stopnetwork == true)
break;
clients[_countClient] = _server.AcceptTcpClient();
string clientIP = GetIp(_countClient);
string subName = IPToSub(clientIP);
StreamReader streamreader = new
StreamReader(Directory.GetCurrentDirectory() + @"\settings.xml",
System.Text.Encoding.UTF8);
ds = new DataSet();
ds.ReadXml(streamreader, XmlReadMode.Auto);
dt = ds.Tables[0];
List<string> ips = new List<string>();
foreach (DataRow item in dt.Rows)
ips.Add(item.ItemArray[1].ToString());
if (ips.Exists(s => s.Equals(clientIP)))
{
Thread readThread = new Thread(ReceiveRun);
readThread.Start(_countClient);
_countClient++;
//Передача списка мероприятий при подключении
Invoke(new AddClientsListDelegate(AddClientsList), new
object[] {subName, clientIP});
107
Invoke(new
AddClientReceiveDisplayDelegate(AddClientReceiveDisplay),
new object[] {subName, clientIP});
//Передача списка мероприятий
SendMeasure(subName, _countClient);
//Передача списка клиентов
SendListClients();
}
else
{
Send(_countClient, "{E}");
clients[_countClient] = null;
}
}
}
catch
{
ErrorSound();
}
}
//Метод ожидания приёма сообщений (для каждого клиента - в отдельном потоке)
void ReceiveRun(object num)
{
try
{
while (true)
{
if (clients[(int)num] == null || _stopnetwork == true)
return;
string message = null;
NetworkStream ns = clients[(int)num].GetStream();
while (ns.DataAvailable == true)
{
byte[] buffer = new byte[clients[(int)num].Available];
ns.Read(buffer, 0, buffer.Length);
message = Encoding.Default.GetString(buffer);
if (message != null && message.StartsWith("{D}"))
DisconnectMessage((int)num);
if (message != null && message.StartsWith("{F}"))
SendFileToClient((int)num);
if (message != null && message.StartsWith("{C}"))
ClientToClientMessage(message, (int)num);
if (message != null && message.StartsWith("{M}"))
SendMeasure(IPToSub(GetIp((int)num)), (int)num);
}
Thread.Sleep(100);
}
}
catch
{
ErrorSound();
}
}
108
#region Методы отправки сообщений
//Отправка сообщения клиенту
void Send(object num, string text)
{
try
{
NetworkStream ns = clients[(int)num].GetStream();
byte[] myReadBuffer = Encoding.Default.GetBytes(text);
ns.BeginWrite(myReadBuffer, 0, myReadBuffer.Length, new
AsyncCallback(AsyncSendCompleted), ns);
}
catch
{
ErrorSound();
}
}
//Отправка файла клиенту
void SendFile(object num, byte[] buffer)
{
try
{
NetworkStream ns = clients[(int)num].GetStream();
ns.BeginWrite(buffer, 0, buffer.Length, new
AsyncCallback(AsyncSendCompleted), ns);
}
catch
{
ErrorSound();
}
}
//Отправка сообщеняи всем клиентам
void SendToAll(string text)
{
try
{
for (int i = 0; i < MAXNUMCLIENTS; i++)
if (clients[i] != null)
{
NetworkStream ns = clients[i].GetStream();
byte[] myReadBuffer = Encoding.Default.GetBytes(text);
ns.BeginWrite(myReadBuffer, 0, myReadBuffer.Length, new
AsyncCallback(AsyncSendCompleted), ns);
}
}
catch
{
ErrorSound();
}
}
//Отправка сообщения выбранным в списке клиентам
void SendToSelected(string text)
{
try
{
foreach (string item in clientsList.CheckedItems)
{
string sendIP = item.Substring(item.IndexOf('(') + 1,
item.IndexOf(')') - item.IndexOf('(') - 1);
for (int i = 0; i < MAXNUMCLIENTS; i++)
if (clients[i] != null && sendIP == GetIp(i))
109
{
NetworkStream ns = clients[i].GetStream();
byte[] myReadBuffer = Encoding.Default.GetBytes(text);
ns.BeginWrite(myReadBuffer, 0, myReadBuffer.Length, new
AsyncCallback(AsyncSendCompleted), ns);
}
}
}
catch
{
ErrorSound();
}
}
//Метод завершения асинхронной передачи сообщения
public void AsyncSendCompleted(IAsyncResult ar)
{
NetworkStream ns = (NetworkStream)ar.AsyncState;
ns.EndWrite(ar);
}
//Метод отправки списка мероприятий
void SendMeasure(string subName, int num)
{
string message = null;
meropriatiaTableAdapter.FillBy(measureDataSet.Meropriatia, subName);
message += "{M}";
foreach (DataRow item in measureDataSet.Meropriatia.Rows)
{
object[] temp = item.ItemArray;
for (int i = 0; i < temp.Length; i++)
{
if (i == 3 && string.IsNullOrEmpty(temp[i].ToString()))
temp[i] = DateTime.MaxValue.Date;
message += temp[i].ToString() + "#";
}
message = message.Remove(message.Length - 1);
message += "$";
}
message = message.Remove(message.Length - 1);
Send(num, message);
}
//Метод отправки списка клиентов
void SendListClients()
{
string message = null;
for (int i = 0; i < MAXNUMCLIENTS; i++ )
{
if (clients[i] != null)
{
message = "{L}";
foreach (var item in clientsList.Items)
if (item.ToString() != IPToSub(GetIp(i)) + " (" + GetIp(i) +
")")
message += item.ToString() + "#";
message = message.Remove(message.Length - 1);
Thread.Sleep(100);
Send(i, message);
message = null;
}
}
}
110
#endregion
//Метод определения отдела по IP-адресу
string IPToSub (string IP)
{
XmlDocument xmlFile = new XmlDocument();
string sub = null;
using (StreamReader streamreader = new
StreamReader(Directory.GetCurrentDirectory() + @"\settings.xml",
System.Text.Encoding.UTF8))
xmlFile.Load(streamreader);
XmlNodeList list = xmlFile.GetElementsByTagName("Отдел");
for (int i = 0; i < list.Count; i++)
{
XmlElement subdivision =
(XmlElement)xmlFile.GetElementsByTagName("Имя")[i];
XmlElement address = (XmlElement)xmlFile.GetElementsByTagName("IP-
адрес")[i];
if (address.InnerText == IP)
{
sub = subdivision.InnerText;
break;
}
}
return sub;
}
//Определение IP-адреса пользовател по номеру в массиве клиентов
string GetIp(int num)
{
return
Convert.ToString(((IPEndPoint)clients[num].Client.RemoteEndPoint).Address);
}
//Звуковое оповещение об ошибке
void ErrorSound()
{
Console.Beep(3000, 80);
Console.Beep(1000, 100);
}
//Запись строки в файл лога
void LogingToFile(string mess)
{
FileInfo fi = new FileInfo(Directory.GetCurrentDirectory() + @"\log\" +
DateTime.Now.Date.ToShortDateString() + ".txt");
if (!Directory.Exists(fi.DirectoryName))
Directory.CreateDirectory(fi.DirectoryName);
File.AppendAllText(fi.FullName, "[" + DateTime.Now + "] " + mess + "\r\n",
Encoding.GetEncoding(1251));
}
#region Делегаты и их методы
//Делегат безопасного обновления окна сообщений
protected delegate void UpdateReceiveDisplayDelegate(string sender, string
recip, string message);
//Метод обновления окна сообщений
public void UpdateReceiveDisplay(string sender, string recip, string message)
{
showMessListBox.Items.Add("[" + DateTime.Now + "] " + sender + " -> " +
recip + ": " + message);
showMessListBox.SelectedIndex = showMessListBox.Items.Count - 1;

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
IPO - инструмент финансирования деятельности организации. На примере ПАО «Нефтяная компания «Лукойл»
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)