ТЕСТИРОВАНИЕ ПРОГРАММНОГО СРЕДСТВА




Программный клиент представляет собой окно с кнопками для отправки, присоединения, вызова программы с приватным каналом. (Рис. 4.1)

 

Рисунок 4.1 – Чат-клиент

Пользователь вводит свой никнейм, сервер к которому он собирается подключиться и порт сервера, после этого он нажимает кнопку «Вход». При удачном соединении пользователю приходит сообщение о том, что он находится в чате. При неудаче он будет уведомлен об ошибке. (Рис. 4.2)

 

Рисунок 4.2 – Успешный/Неудачный вход

 

Вход, выход, отправка сообщений регистрируются на сервере, и администратор может следить за тем, сколько людей на сервере, что они говорят, отправлять сообщения всем или конкретным пользователям, также он выгонять пользователей с помощью специальной кнопки. Пример чата указан на рисунке 4.3

 

Рисунок 4.3 – Пример работы чата

Также пользователи могут общаться в приватном канале, указав свой IP-адрес и порт, а так же IP-адрес и порт своего собеседника, подключившись, в дальнейшем к каналу связи. (Рис. 4.4)

 

Рисунок 4.4 – Окно чата с приватным каналом


 

ЗАКЛЮЧЕНИЕ

В данной работе было реализовано программное средство для обмена текстовыми сообщениями между пользователями.

В рамках данной работы были решены следующие задачи:

- Реализована программа-сервер для объединения группы пользователей и мониторинга их действий.

- Создана программа-клиент, служащая для подключения и общения в чате.

- Реализована приват-канальная программа.


 

CПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Липпман, Стенли Б., Ложойе, Жози, Му, Барбара Э. Язык программирования С#. Базовый курс, 5-е изд., 2014. – 1120с.

2. Шлее М. «5.3. Профессиональное программирование на C#» - БХВ-Петербург, 2015 – 928 стр.

3. Интерактивный учебник C# https://msdn.microsoft.com/ru-ru/library/bb383962(v=vs.90).aspx

 

 

ПРИЛОЖЕНИЕ А

Техническое задание на программное средство

 

«СОГЛАСОВАНО» Руководитель проекта _________ А.П. Кузин «____» ___________2016 г.       «УТВЕРЖДЕНО» зав. кафедрой «ПОВТ и АС» ___________А.Н. Карапетянц «____» ____________ 2016 г.

1. Введение

1.1 Наименование программы

Наименование разрабатываемого программного средства: «Сетевой чат».

1.2 Области применения

Областью применения данного программного продукта являются юридические и физические лица, которым нужен доступ к общению.

1.3 Объект внедрения

Конечное программное средство предназначено для внедрения ко всем пользователям ПК, имеющим доступ к сети.

2. ОСНОВАНИЕ ДЛЯ РАЗРАБОТКИ

2.1 Основание для проведения разработки

Основной документ: «Учебный план для студентов ВУЗа», обучающихся по специальности 231000 «Программная инженерия» Организация: «Донской Государственный Технический Университет», факультет «Информатика и вычислительная техника».

2.2 Наименование и условное обозначение темы разработки

Наименование темы разработки - «Программная реализация сетевого текстового чата».

3. НАЗНАЧЕНИЕ РАЗРАБОТКИ

3.1 Функциональное назначение программы

Функциональным назначением программы является установка связи для общения между пользователями.

3.2 Эксплуатационное назначение программы

Программа предназначена для использования в качестве приложения на компьютерах пользователей.

4. ТРЕБОВАНИЕ К ПРОГРАММЕ

4.1 Требование к функциональным характеристикам

Название Алгоритмическая Программная  
Отправка сообщений Заимствованная Заимствованная
Подключение к серверу Заимствованная Заимствованная
Удаление клиента Заимствованная Заимствованная
Запуск сервера Заимствованная Заимствованная
Трансляция сообщений Заимствованная Заимствованная
Подключение к пользователю Заимствованная Заимствованная

 

Функциями программы являются: ввод, вывод, отправка и получение информации в виде текстовых сообщений со стороны пользователей, и мониторинг деятельности пользователей со стороны администратора

4.1.1 Требования к составу выполняемых функций

Программа должна обеспечивать возможность выполнения перечисленных ниже функций:

· добавление, удаление и редактирование информации;

· контроль ошибок;

· установка связи «Клиент-Сервер»

4.1.2 Требования к организации входных данных

Входные данные программы вводятся пользователем, обрабатываются программным средством и представляют собой различную совокупность текстовой информации:

· данные, вводимые пользователем.

4.1.3 Требования к организации выходных данных

Выходные данные выводятся программным средством пользователям и представляют собой различную совокупность текстовой информации:

 

· данные, вводимые пользователем.

4.2 Требования к надежности

4.2.1 Требования к обеспечению надежного (устойчивого) функционирования программы

Надежное (устойчивое) функционирование программы должно быть обеспечено выполнением совокупности организационно-технических мероприятий, перечень которых приведен ниже:

· организацией бесперебойного питания технических средств;

· организацией бесперебойного канала связи между сервером и пользователями;

· организацией исправного оборудования и программного обеспечения.

4.2.2. Время восстановления после отказа

Время восстановления после отказа, вызванного сбоем электропитания технических средств (иными внешними факторами), не фатальным сбоем (не крахом) операционной системы, не должно превышать времени, необходимого на перезагрузку операционной системы и запуск программы, при условии соблюдения условий эксплуатации технических и программных средств.

Время восстановления после отказа, вызванного неисправностью технических средств, фатальным сбоем (крахом) операционной системы, не должно превышать времени, требуемого на устранение неисправностей технических средств и переустановки программных средств.

4.2.3 Отказы из-за некорректных действий оператора

Отказы программы возможны вследствие некорректных действий оператора (пользователя) при взаимодействии с операционной системой. Во избежание возникновения отказов программы по указанной выше причине следует обеспечить работу конечного пользователя без предоставления ему административных привилегий.

4.3 Условия эксплуатации

4.3.1. Климатические условия эксплуатации

Климатические условия эксплуатации, при которых должны обеспечиваться заданные характеристики, должны удовлетворять требованиям, предъявляемым к техническим средствам в части условий их эксплуатации.

4.3.2 Требования к численности и квалификации персонала

Минимальное количество персонала, требуемого для работы программы, должно составлять не менее 2 штатных единиц – держатель сервера (администратор) и клиент (рядовой пользователь чата).

4.4 Требования к составу и параметрам технических средств

В состав технических средств должен входить IBM-совместимый персональный компьютер (ПЭВМ), включающий в себя:

· процессор не менее Pentium 133 MHz

· не менее 4 Мбайт свободной RAM;

· не менее 400 Кбайт места на жестком диске;

· оптический манипулятор типа «мышь»;

· монитор;

· клавиатура.

4.5 Требования к информационной и программной совместимости

4.5.1 Требования к исходным кодам и языкам программирования

Исходные коды программы должны быть реализованы на языке C#. В качестве инструмента разработки был выбран Visual Studio.

4.5.2 Требования к программным средствам, используемым программой

На используемом оборудование должен быть установлен Windows (8/или выше) Так же требуется знать IP адрес и порт сервера для корректной работы.

5. ТРЕБОВАНИЕ К ПРОГРАММНОЙ ДОКУМЕНТАЦИИ

5.1 Предварительный состав программной документации

Состав программной документации должен включать в себя:

· техническое задание ГОСТ 19.201;

· задание к учебной практике;

· текст программы по 19.401-78.

6. СТАДИИ И ЭТАПЫРАЗРАБОТКИ

Таблица 1 – Стадии и этапы разработки

Этапы разработки Время работы в часах
Первоначальное обдумывание проекта  
Создание чернового варианта  
Создание псевдокода  
Пробный запуск программы 0.5
Исправление ошибок  
Составление документации  
Вывод конечного исправного варианта  

 

7. ПОРЯДОК ПРИЕМА И КОНТРОЛЯ

Контроль производится в университете, на компьютерах в ходе защиты курсовой работы. Пример для проверки дается преподавателем.

 

Разработал

студент гр. ВПР_2 «____»____________20__год

Благодарный Александр Васильевич

 


ПРИЛОЖЕНИЕ Б

Исходный код программного средства

Полный исходный код проекта находится на прилагаемом носителе.

Листинг Б.1 - Исходный код формы ChatServer

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using NetworksApi.TCP.SERVER;

using System.Media;

using System.IO;

using System.Net;

 

namespace ChatServer

{

public delegate void UpdateChatLog(string txt);

public delegate void UpdateListBox(ListBox box, string value, bool Remove);

 

public partial class ChatServer: Form

{

Server server;

 

public ChatServer()

{

InitializeComponent();

}

 

private void Form1_Load(object sender, EventArgs e)

{

server = new Server("192.168.1.100", "7770");

server.OnClientConnected += new OnConnectedDelegate(Server_OnClientConnected);

server.OnClientDisconnected += new OnDisconnectedDelegate(Server_OnClientDisconnected);

server.OnDataReceived += new OnReceivedDelegate(Server_OnDataReceived);

server.OnServerError += new OnErrorDelegate(Server_OnServerError);

server.Start();

}

 

private void ChangeChatLog(string txt)

{

if (richTextBox1.InvokeRequired)

{

Invoke(new UpdateChatLog(ChangeChatLog), new object[] { txt });

SoundPlayer player = new SoundPlayer("@/media/Windows Proximity Notification.wav");

player.Play();

}

else

{

richTextBox1.Text += txt + "\r\n";

}

}

 

private void ChangeListBox(ListBox box, string value, bool Remove)

{

if (box.InvokeRequired)

{

Invoke(new UpdateListBox(ChangeListBox), new object[] { box, value, Remove });

}

else

{

if (Remove)

{

box.Items.Remove(value);

}

else

{

box.Items.Add(value);

}

}

}

 

private void Server_OnServerError(object Sender, ErrorArguments R)

{

MessageBox.Show(R.ErrorMessage);

}

 

private void Server_OnDataReceived(object Sender, ReceivedArguments R)

{

ChangeChatLog(R.ReceivedData);

server.BroadCast(R.ReceivedData);

}

 

private void Server_OnClientDisconnected(object Sender, DisconnectedArguments R)

{

server.BroadCast("Кто-то уходит");

ChangeListBox(listBox1, R.Name, true);

ChangeListBox(listBox2, R.Ip, true);

}

 

private void Server_OnClientConnected(object Sender, ConnectedArguments R)

{

server.BroadCast("Кто-то заходит");

ChangeListBox(listBox1, R.Name, false);

ChangeListBox(listBox2, R.Ip, false);

}

 

private void button1_Click(object sender, EventArgs e)

{

server.SendTo((string)listBox1.SelectedItem, textBox2.Text);

}

 

private void button2_Click(object sender, EventArgs e)

{

server.BroadCast(textBox2.Text);

}

 

private void button3_Click(object sender, EventArgs e)

{

server.DisconnectClient((string)listBox1.SelectedItem);

}

 

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

System.Environment.Exit(System.Environment.ExitCode);

}

 

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

{

listBox2.SelectedIndex = listBox1.SelectedIndex;

}

 

private void listBox2_SelectedIndexChanged(object sender, EventArgs e)

{

listBox1.SelectedIndex = listBox2.SelectedIndex;

}

}

}

 

Листинг Б.2 - Исходный код формы ChatClient

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using NetworksApi.TCP.CLIENT;

using System.Media;

 

namespace WindowsFormsApplication1

{

public delegate void UpdateText(string txt);

public partial class ChatClient: Form

{

Client client;

 

public ChatClient()

{

InitializeComponent();

}

 

private void Form1_Load(object sender, EventArgs e)

{

 

}

 

private void richTextBox1_TextChanged(object sender, EventArgs e)

{

richTextBox1.SelectionStart = richTextBox1.Text.Length;

richTextBox1.ScrollToCaret();

}

 

 

private void ChangeTextBox(string txt)

{

if(richTextBox1.InvokeRequired)

{

Invoke(new UpdateText(ChangeTextBox), new object[] { txt });

}

else

{

richTextBox1.Text += txt + "\r\n";

}

}

 

 

// Присоединение к серверу

 

private void button3_Click(object sender, EventArgs e)

{

if (textBox3.Text!= "" || textBox4.Text!= "" || textBox5.Text!= "")

{

client = new Client();

client.ClientName = textBox4.Text;

client.ServerIp = textBox3.Text;

client.ServerPort = textBox5.Text;

 

client.OnClientConnected += new OnClientConnectedDelegate(client_OnClientConnected);

client.OnClientConnecting += new OnClientConnectingDelegate(client_OnClientConnecting);

client.OnClientDisconnected += new OnClientDisconnectedDelegate (client_OnClientDisconnected);

client.OnClientError += new OnClientErrorDelegate(client_OnClientError);

 

client.OnDataReceived += new OnClientReceivedDelegate(Client_OnDataReceived);

client.Connect();

button3.Enabled =false;

}

else

{

MessageBox.Show("Заполните все верхние поля!");

}

}

 

//получение данных

 

private void Client_OnDataReceived(object Sender, ClientReceivedArguments R)

{

ChangeTextBox(R.ReceivedData);

SoundPlayer player = new SoundPlayer("@/media/Windows Proximity Notification.wav");

player.Play();

 

}

 

 

private void client_OnClientError(object Sender, ClientErrorArguments R)

{

ChangeTextBox(R.ErrorMessage);

}

 

private void client_OnClientDisconnected(object Sender, ClientDisconnectedArguments R)

{

ChangeTextBox(R.EventMessage);

}

 

private void client_OnClientConnecting(object Sender, ClientConnectingArguments R)

{

ChangeTextBox(R.EventMessage);

}

 

private void client_OnClientConnected(object Sender, ClientConnectedArguments R)

{

ChangeTextBox(R.EventMessage);

}

 

//отправка сообщения

private void button1_Click(object sender, EventArgs e)

{

if (client!= null && client.IsConnected)

{

client.Send(textBox4.Text + ": " + textBox2.Text);

textBox2.Clear();

}

}

 

private void button2_Click(object sender, EventArgs e)

{

textBox2.Clear();

}

 

private void textBox2_KeyDown(object sender, KeyEventArgs e)

{

if (client!= null && client.IsConnected && e.KeyCode == Keys.Enter)

{

client.Send(textBox4.Text + ": " + textBox2.Text);

textBox2.Clear();

}

}

 

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

System.Environment.Exit(System.Environment.ExitCode);

}

 

private void button4_Click(object sender, EventArgs e)

{

{

{

System.Diagnostics.Process p = new System.Diagnostics.Process();

p.StartInfo.FileName = @"Private\Chat\Chat\bin\Debug\Chat.exe";

p.Start();

}

}

}

}

}

Листинг Б.3 - Исходный код формы PrivateChanel

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

 

using System.Net;

using System.Net.Sockets;

using System.Media;

 

 

namespace Chat

{

 

 

public partial class PrivateChanel: Form

{

 

 

Socket socket;

EndPoint localEndPoint, remoteEndPoint;

 

public PrivateChanel()

{

InitializeComponent();

 

socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

 

 

textLocalIP.Text = GetLocalIP();

textFriendsIP.Text = GetLocalIP();

}

 

private string GetLocalIP()

{

IPHostEntry host;

host = Dns.GetHostEntry(Dns.GetHostName());

 

 

foreach(IPAddress ip in host.AddressList)

{

if(ip.AddressFamily == AddressFamily.InterNetwork)

{

return ip.ToString();

}

}

 

return "127.0.0.1";

}

 

private void MessageCallBack(IAsyncResult aResult)

{

try

{

int size = socket.EndReceiveFrom(aResult, ref remoteEndPoint);

if(size>0)

{

byte[] receiveData = new byte[1464];

 

receiveData = (byte[])aResult.AsyncState;

 

UTF8Encoding eEnconding = new UTF8Encoding();

string receivedMessage = eEnconding.GetString(receiveData);

 

listMessage.Items.Add("Собеседник: " + receivedMessage);

SoundPlayer player = new SoundPlayer("@/media/Windows Proximity Notification.wav");

player.Play();

 

}

 

byte[] buffer = new byte[1500];

socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEndPoint, new AsyncCallback(MessageCallBack), buffer);

 

}

catch(Exception exp)

{

MessageBox.Show(exp.ToString());

}

}

 

private void button2_Click(object sender, EventArgs e)

{

 

}

 

private void groupBox1_Enter(object sender, EventArgs e)

{

 

}

 

private void button1_Click(object sender, EventArgs e)

{

try

{

 

localEndPoint = new IPEndPoint(IPAddress.Parse(textLocalIP.Text), Convert.ToInt32(textLocalPort.Text));

 

socket.Bind(localEndPoint);

 

 

remoteEndPoint = new IPEndPoint(IPAddress.Parse(textFriendsIP.Text), Convert.ToInt32(textFriendsPort.Text));

 

socket.Connect(remoteEndPoint);

 

 

byte[] buffer = new byte[1500];

socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEndPoint, new AsyncCallback(MessageCallBack), buffer);

 

 

button1.Text = "OK";

button1.Enabled = false;

 

button2.Enabled = true;

 

textMessage.Focus();

}

catch(Exception ex)

{

MessageBox.Show(ex.ToString());

}

}

 

private void button2_Click_1(object sender, EventArgs e)

{

try

{

 

System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();

byte[] msg = new byte[1500];

msg = enc.GetBytes(textMessage.Text);

 

socket.Send(msg);

 

listMessage.Items.Add("Вы: " + textMessage.Text);

 

textMessage.Text = "";

 

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString());

}

}

 

private void textMessage_KeyUp(object sender, KeyEventArgs e)

{

if (e.KeyCode == Keys.Enter)

{

try

{

 

System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();

byte[] msg = new byte[1500];

msg = enc.GetBytes(textMessage.Text);

 

socket.Send(msg);

 

listMessage.Items.Add("Вы: " + textMessage.Text);

 

textMessage.Text = "";

 

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString());

}

}

}

 

private void Form1_Load(object sender, EventArgs e)

{

 

}

}

}

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: