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

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
111
showMessListBox.SelectedIndex = -1;
LogingToFile(sender + " -> " + recip + ": " + message);
}
//Делегат безопасного обновления окна сообщений
protected delegate void AddClientReceiveDisplayDelegate(string subname, string
clientIP);
//Метод обновления окна сообщений
public void AddClientReceiveDisplay(string subname, string clientIP)
{
showMessListBox.Items.Add("[" + DateTime.Now + "] " + subname + " (" +
clientIP + ")" + " подключился");
showMessListBox.SelectedIndex = showMessListBox.Items.Count - 1;
showMessListBox.SelectedIndex = -1;
LogingToFile(subname + " (" + clientIP + ")" + " подключился");
}
//Делегат безопасного добавления в список клиентов
protected delegate void AddClientsListDelegate(string subname, string
clientIP);
//Метод добавления в списко клиентов
public void AddClientsList(string subname, string clientIP)
{
clientsList.Items.Add(subname + " (" + clientIP + ")");
}
//Делегат безопасного удаления из списка клиентов
protected delegate void RemoveClientsListDelegate(string subname, string
clientIP);
//Метод удаления из списка клиентов
public void RemoveClientsList(string subname, string clientIP)
{
clientsList.Items.Remove(subname + " (" + clientIP + ")");
}
#endregion
#region Методы облегчения кода из метода принятия сообщений
//Получение сообщения об отключении клиента
void DisconnectMessage(int num)
{
string clientIP = GetIp(num);
string subName = IPToSub(clientIP);
Invoke(new RemoveClientsListDelegate(RemoveClientsList), new object[] {
subName, clientIP });
clients[num] = null;
SendListClients();
}
//Получение и отправка сообщений клиент-клиент
void ClientToClientMessage(string message, int num)
{
message = message.Remove(0, 3);
string[] recipMessage = message.Split('#');
string answer = null;
for (int i = 0; i < MAXNUMCLIENTS; i++)
if (clients[i] != null && recipMessage[0] == GetIp(i))
{
string senderIP = GetIp(num);
string subName = IPToSub(senderIP);
112
string sender = subName + " (" + senderIP + ")";
answer = "{C}" + sender + "#" + recipMessage[1];
Invoke(new UpdateReceiveDisplayDelegate(UpdateReceiveDisplay),
new object[] { sender, IPToSub(recipMessage[0]) + " (" +
recipMessage[0] + ")", recipMessage[1] });
Send(i, answer);
}
}
//Отправка файла клиенту
void SendFileToClient(int num)
{
NetworkStream nss = clients[num].GetStream();
BinaryReader reader = new BinaryReader(nss);
string senderIP = GetIp(num);
string subName = IPToSub(senderIP);
string sender = subName + " (" + senderIP + ")";
string recipIP = reader.ReadString();
string fileName = reader.ReadString();
Invoke(new UpdateReceiveDisplayDelegate(UpdateReceiveDisplay),
new object[] { sender, IPToSub(recipIP) + " (" + recipIP + ")",
"отправлен файл " + fileName });
using (FileStream outputStream = File.Open(fileName, FileMode.Create))
{
long lenght = reader.ReadInt64();
long totalBytes = 0;
int readBytes = 0;
byte[] buffer = new byte[2048];
do
{
readBytes = nss.Read(buffer, 0, buffer.Length);
outputStream.Write(buffer, 0, readBytes);
totalBytes += readBytes;
}
while (totalBytes < lenght);
}
for (int i = 0; i < MAXNUMCLIENTS; i++)
if (clients[i] != null && recipIP == GetIp(i))
{
NetworkStream nsr = clients[i].GetStream();
BinaryWriter writer = new BinaryWriter(nsr);
byte[] info = Encoding.Default.GetBytes("{F}");
nsr.Write(info, 0, info.Length);
Thread.Sleep(100);
using (FileStream fs = File.OpenRead(fileName))
{
long lenght = fs.Length;
writer.Write(sender);
writer.Write(fileName);
writer.Write(lenght);
long totalBytes = 0;
int readBytes = 0;
byte[] buffer = new byte[2048];
do
{
113
readBytes = fs.Read(buffer, 0, buffer.Length);
nsr.Write(buffer, 0, readBytes);
totalBytes += readBytes;
}
while (totalBytes < lenght);
}
}
}
#endregion
}
}
Клиентская часть
Модуль clientForm
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace EPIS.Client
{
public partial class clientForm : Form
{
// Объект содержащий рабочий сокет клиентского приложения
TcpClient _tcpСlient = new TcpClient();
// Объект сетевого потока для приема и отправки сообщений
NetworkStream ns;
// Флаг для остановки потоков и завершения сетевой работы приложения
bool _stopNetwork;
//Переменная имени файла
FileInfo fi;
//Переменная адреса сервера
string ipServer = null;
public clientForm()
{
InitializeComponent();
ipServer = File.ReadAllText(@"settings.txt");
}
#region Методы управления сервером
//Подключение к серверу
void Connect()
{
try
{
_tcpСlient = new TcpClient();
_tcpСlient.Connect(ipServer, 5812);
ns = _tcpСlient.GetStream();
Thread th = new Thread(ReceiveRun);
114
th.Start();
_stopNetwork = false;
connectionStatusLabel.Text = "Подключен";
подключитьсяToolStripMenuItem.Enabled = false;
messTextBox.Enabled = true;
sendButton.Enabled = true;
fileButton.Enabled = true;
clearButton.Enabled = true;
showMessListBox.Items.Add("[" + DateTime.Now + "] Подключен к
серверу");
showMessListBox.SelectedIndex = showMessListBox.Items.Count - 1;
showMessListBox.SelectedIndex = -1;
}
catch
{
showMessListBox.Items.Add("[" + DateTime.Now + "] Ошибка
подключения");
showMessListBox.SelectedIndex = showMessListBox.Items.Count - 1;
showMessListBox.SelectedIndex = -1;
}
}
//Отключение от сервера
void CloseClient(bool flag)
{
if (ns != null)
ns.Close();
if (_tcpСlient != null)
_tcpСlient.Close();
_stopNetwork = true;
Invoke(new StatusFalseDelegate(StatusFalse));
}
void CloseClient()
{
if (_stopNetwork == false)
{
Send("{D}");
if (ns != null)
ns.Close();
if (_tcpСlient != null)
_tcpСlient.Close();
_stopNetwork = true;
StatusFalse();
}
}
#endregion
#region Служебные методы
//Метод подключения к серверу при запуске приложения
private void clientForm_Load(object sender, EventArgs e)
{
Connect();
}
//Метод подключения к серверу по кнпоке в меню
private void подключитьсяToolStripMenuItem_Click(object sender, EventArgs e)
{
Connect();
}
//Метод отключения от сервера при закрытии приложения
115
private void clientForm_FormClosed(object sender, FormClosedEventArgs e)
{
CloseClient();
}
//Метод запроса списка мероприятий по кнопке в меню
private void мероприятияToolStripMenuItem_Click(object sender, EventArgs e)
{
Send("{M}");
}
//Очистка поял файла
private void clearButton_Click(object sender, EventArgs e)
{
fileTextBox.Text = "";
openFile.FileName = "";
}
//Открытие формы настроек
private void настройкиToolStripMenuItem_Click(object sender, EventArgs e)
{
new settingsForm(ipServer).ShowDialog();
}
//Очистка окна сообщений из контекстного меню
private void очиститьToolStripMenuItem_Click(object sender, EventArgs e)
{
showMessListBox.Items.Clear();
}
//Вызов справочного файла
private void справкаToolStripMenuItem_Click(object sender, EventArgs e)
{
Process.Start("Help.chm");
}
//Открытие формы О программе из меню
private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)
{
new aboutForm().ShowDialog();
}
//Закрытие программы из меню
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
#endregion
#region Методы работы с файлами
//Метод отправки сообщения по кнопке
private void sendButton_Click(object sender, EventArgs e)
{
if (clientsList.SelectedItem != null)
{
string message = null;
string recip = clientsList.SelectedItem.ToString();
string recipIP = recip.Substring(recip.IndexOf('(') + 1,
recip.IndexOf(')') - recip.IndexOf('(') - 1);
if (fileTextBox.Text != "")
{
116
BinaryWriter writer = new BinaryWriter(ns);
byte[] info = Encoding.Default.GetBytes("{F}");
ns.Write(info, 0, info.Length);
Thread.Sleep(100);
//Отправка файла
using (FileStream fs = File.OpenRead(fileTextBox.Text))
{
long lenght = fs.Length;
writer.Write(recipIP);
writer.Write(fi.Name);
writer.Write(lenght);
long totalBytes = 0;
int readBytes = 0;
byte[] buffer = new byte[2048];
do
{
readBytes = fs.Read(buffer, 0, buffer.Length);
ns.Write(buffer, 0, readBytes);
totalBytes += readBytes;
}
while (totalBytes < lenght);
}
showMessListBox.Items.Add("[" + DateTime.Now + "] Я -> " + recip +
" отправлен файл: " + fi.Name);
showMessListBox.SelectedIndex = showMessListBox.Items.Count - 1;
showMessListBox.SelectedIndex = -1;
fileTextBox.Text = null;
}
else
{
if (messTextBox.Text != "")
{
showMessListBox.Items.Add("[" + DateTime.Now + "] Я -> " +
recip + ": " + messTextBox.Text);
showMessListBox.SelectedIndex = showMessListBox.Items.Count -
1;
showMessListBox.SelectedIndex = -1;
message = "{C}" + recipIP + "#" + messTextBox.Text;
Send(message);
messTextBox.Clear();
}
else
MessageBox.Show("Нельзя отправить пустое сообщение",
"Ошибка");
}
}
else
{
MessageBox.Show("Необходимо выбрать получателя", "Ошибка");
}
}
//Метод открытия файла для отправки
private void fileButton_Click(object sender, EventArgs e)
{
openFile.ShowDialog();
if (openFile.FileName != "")
{
fileTextBox.Text = openFile.FileName;
fi = new FileInfo(fileTextBox.Text);
117
}
}
#endregion
// Цикл извлечения сообщений (в отдельном потоке)
void ReceiveRun()
{
try
{
while (true)
{
if (this.IsDisposed || _stopNetwork == true)
return;
string message = null;
while (ns.DataAvailable == true)
{
byte[] buffer = new byte[_tcpСlient.Available];
ns.Read(buffer, 0, buffer.Length);
message = Encoding.Default.GetString(buffer);
if (message != null && message.StartsWith("{M}"))
new
measuresShowForm(MeasureMessage(message)).ShowDialog();
if (message != null && message.StartsWith("{L}"))
ListClientMessage(message);
if (message != null && message.StartsWith("{C}"))
ClientToClientMessage(message);
if (message != null && message.StartsWith("{F}"))
FileMessage(message);
if (message != null && message.StartsWith("{S}"))
{
message = message.Remove(0, 3);
Invoke(new
UpdateReceiveDisplayDelegate(UpdateReceiveDisplay), new object[] { "Сервер", message
});
notifyIcon.ShowBalloonTip(5000, "Сервер", message,
ToolTipIcon.Info);
}
if (message != null && message.StartsWith("{O}"))
{
CloseClient(true);
return;
}
if (message != null && message.StartsWith("{E}"))
{
Invoke(new
UpdateReceiveDisplayDelegate(UpdateReceiveDisplay), new object[] { "Сервер", "Вас нет
в списке пользователей" });
CloseClient(true);
return;
}
}
Thread.Sleep(100);
}
}
118
catch
{
ErrorSound();
}
}
// Отправка сообщений
void Send(string message)
{
try
{
byte[] buffer = Encoding.Default.GetBytes(message);
ns.Write(buffer, 0, buffer.Length);
}
catch
{
ErrorSound();
}
}
//Метод конвертации списка массивов string в DataTable
void ListToDataTable(DataTable dt, List<string[]> table)
{
dt.Columns.Add("Номер мероприятия", System.Type.GetType("System.Int32"));
dt.Columns.Add("Основание");
dt.Columns.Add("Мероприятие");
dt.Columns.Add("Срок выполнения", System.Type.GetType("System.DateTime"));
dt.Columns.Add("Исполнитель");
dt.Columns.Add("Предъявитель");
dt.Columns.Add("Выполнение");
dt.Columns.Add("Категория");
foreach (string[] item in table)
dt.Rows.Add(item);
}
// Звуковое оповещение о перехваченной ошибке.
void ErrorSound()
{
Console.Beep(2000, 80);
Console.Beep(3000, 120);
}
#region Делегаты и их методы
//Делегат открытия окна сохранения
private delegate DialogResult ShowSaveFileDialogDelegate();
//Делегат безопасной очистки списка клиентов
protected delegate void ClearClientsListDelegate();
//Метод очистки списка клиентов
public void ClearClientsList()
{
clientsList.Items.Clear();
}
//Делегат безопасной смены статуса false
protected delegate void StatusFalseDelegate();
//Метод отрицательного статуса
public void StatusFalse()
{
messTextBox.Enabled = false;
sendButton.Enabled = false;
119
fileButton.Enabled = false;
clearButton.Enabled = false;
connectionStatusLabel.Text = "Отключен";
подключитьсяToolStripMenuItem.Enabled = true;
showMessListBox.Items.Add("[" + DateTime.Now + "] Отключен от сервера");
showMessListBox.SelectedIndex = showMessListBox.Items.Count - 1;
showMessListBox.SelectedIndex = -1;
clientsList.Items.Clear();
}
//Делегат безопасного обновления сообщений
protected delegate void UpdateReceiveDisplayDelegate(string sender, string
message);
//Метод обновления сообщений
public void UpdateReceiveDisplay(string sender, string message)
{
showMessListBox.Items.Add("[" + DateTime.Now + "] " + sender + ": " +
message);
showMessListBox.SelectedIndex = showMessListBox.Items.Count - 1;
showMessListBox.SelectedIndex = -1;
}
//Делегат безопасного обновления списка клиентов
protected delegate void UpdateClientDisplayDelegate(string client);
//Метод обновления списка клиентов
public void UpdateClientDisplay(string client)
{
clientsList.Items.Add(client);
}
#endregion
#region Методы облегчения кода из метода принятия сообщений
//Метод получения списка мероприятий
DataTable MeasureMessage(string message)
{
List<string[]> table = new List<string[]>();
DataTable dt = new DataTable();
message = message.Remove(0, 3);
string[] tempArray = null;
string[] rows = message.Split('$');
foreach (string item in rows)
{
tempArray = item.Split('#');
table.Add(tempArray);
}
ListToDataTable(dt, table);
return dt;
}
//Метод получения списка клиентов
void ListClientMessage(string message)
{
message = message.Remove(0, 3);
string[] rows = message.Split('#');
Invoke(new ClearClientsListDelegate(ClearClientsList));
foreach (string item in rows)
Invoke(new UpdateClientDisplayDelegate(UpdateClientDisplay), item);
120
}
//Метод получения сообщения от клиента
void ClientToClientMessage(string message)
{
message = message.Remove(0, 3);
string[] senderMessage = message.Split('#');
Invoke(new UpdateReceiveDisplayDelegate(UpdateReceiveDisplay), new
object[] { senderMessage[0], senderMessage[1] });
notifyIcon.ShowBalloonTip(5000, senderMessage[0], senderMessage[1],
ToolTipIcon.Info);
}
//Метод получения файла
void FileMessage(string message)
{
BinaryReader reader = new BinaryReader(ns);
string sender = reader.ReadString();
string fileName = reader.ReadString();
if (MessageBox.Show("Принять файл " + fileName + " от " + sender + '?',
"Новый файл", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
saveFile.Filter = fileName + '|' + fileName;
saveFile.FileName = fileName;
ShowSaveFileDialogDelegate invoker = new
ShowSaveFileDialogDelegate(saveFile.ShowDialog);
Invoke(invoker);
using (FileStream outputStream = File.Open(saveFile.FileName,
FileMode.Create))
{
long lenght = reader.ReadInt64();
long totalBytes = 0;
int readBytes = 0;
byte[] buffer = new byte[2048];
do
{
readBytes = ns.Read(buffer, 0, buffer.Length);
outputStream.Write(buffer, 0, readBytes);
totalBytes += readBytes;
}
while (totalBytes < lenght);
}
Invoke(new UpdateReceiveDisplayDelegate(UpdateReceiveDisplay), new
object[] { sender, "принят файл " + fileName });
}
}
#endregion
}
}

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

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