Разработка программы "Сетевой чат"

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



onnectОтключиться от сервера

Таблица 4.5 - Команды сервера:

listОтправить список собеседников list \nfilerequestОтвет на запрос передачи файлаИз приведенного списка команд видно, что протокол является узкоспециальным и предназначен только для данного проекта. С другой стороны, разработка универсального протокола передачи данных является нетривиальной задачей, требующей огромных затрат.

Пример работы по протоколу(К - клиент, С - сервер):

К: guest guest4356 - запрос на подключение

C: list - подключение прошло удачно, сервер рассылает всем новый список собеседников

С: broadcast --- guest4356 вошел в чат ---

К: sendall Привет всем!!!

С: usern broadcast Привет всем

К: - клиент отключился

С: broadcast --- guest4356 покинул чат ---

С: list - сервер рассылает всем новый список собеседников

С: - сервер остановлен

Программа-сервер

Программа выполняет следующие функции:

Авторизация/регистрация пользователей

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

Перелача сообщений от пользователя в приватную комнату

Передача запроса на передачу файла от одного пользователя к другому

Контролирует подключение/отключение клиентов

Логирование работы сервера и общения, подключения/отключения пользователей

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

Описание разработанных классов

Класс Client

class Client

{

//события приема данных от клиента

public event DataReceivedEventHandler DataReceived;

//событие при отключении клиентаevent DisconnectedEventHandler Disconnected;Thread foneListener;//слущающий потокSocket socket;//сокет для подключенияstring name;//имя пользователяbool disconnected;//флаг подключения клиентаClient(Socket socket);//конструктор клиента void connectUser();//подключение пользователя

//функция, которая слушает сокет

private void ListeningFunction();

//обработка команд от подключенных клиентов

private void Parse(string str); string Receive();//Прием сообщения

//Авторизация подключившегося клиента

private string Auth(string str);

//отправить сообщение клиенту

public void Send(string str);

//отключение клиентаvoid Disconnect(string str);

}

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

Класс Server.class Server

{Thread bgListener; //поток, слушающий клиентовSocket listenerSocket; //сокет для клиентовList clients; //список подключенных клиентовint serverPort; //порт для подключения bool running; //флаг запущен сервер или нет

public Server(int port);//конструктор сервераvoid Start();//запуск сервераvoid Stop();//останов сервера

//запуск потока, слушающего клиентов

private void StartToListen();

//добавить нового клиентаvoid CreateNewClient(Socket socket);

// проверка корректности ника при подключении

private bool NickIsIncorrect(string str);

//обработка команд, приходящих от сервера

// executing received command

// args[0] - sender name

// args[1] - command

// args[2] - target name

// args[3] - parameter. Usually, message textvoid CommandRun(string[] args); void SendList(); //рассылка списка собеседников

//оброаботка отключившегося клиентаvoid ClientDisconnected(string disconnectedUser);

//рассылка информационного сообщения/сообщения в общую комнату

private void BroadcastMessage(string sender, string str);

//отослать сообщение в приватную комнатуvoid SendTo(string sender, string target, string str);

//отослать сообщение в приватную комнату отправителю

private void SendBack(string sender, string target, string str);

//обработка передачи файлаvoid SendRequestResult(string sender, string target, string str);

//функция логирования работы сервераvoid AddToLog(string str);

}

Класс Server основной в программе, в нем хранится коллекция объектов подключенных клиентов(Client), в данном классе реализуется обмен данными между подключенными клиентами, обработка подключения/отключения клиентов.

Класс MainFormpartial class MainForm : Form

{Server brain;//указатель на обьект Server MainForm(Server serv);//конструктор главной формы

//запуск сервера

private void startButton_Click(object sender, EventArgs e);

//останов сервераvoid stopButton_Click(object sender, EventArgs e);

//завершение работы сервераvoid MainForm_FormClosing(object sender, FormClosingEventArgs e);

//спрятать/развернуть окно сервера с трей(панель радом с //часами)

private void MainForm_Resize(object sender, EventArgs e);

//обработка разворачивания окна из треяvoid notifyIcon1_MouseClick(object sender, MouseEventArgs e)

//закрыть главное окно, корректно завершить работу сервера

private void exitButton_Click(object sender, EventArgs e);

//показать лог работы сервераvoid logButton_Click(object sender, EventArgs e);

}

Класс MainForm реализует взаимодействие пользователя с интерфейсом программы.

После того как пользователь запустил программу-сервер и сам сервер, создается объект класса Server, у которого есть слушающая функция, которая слушает сокет и ждет новых клиентов, когда подключается новый клиент, создается объект класса Client, который помещается в коллекцию. Данную коллекцию подключенных клиентов и обрабатывает сервер. Объекты Client из коллекции осуществляют взаимодействие через сокет непосредственно с с подключенными к серверу клиентами, они принимают команды, передают их объекту Server, который в свою очередь обрабатывает