Разработка программы "Сетевой чат"
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
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, который в свою очередь обрабатывает