Программирование передачи информации между компьютерами по сети. Клиент-серверные приложения презентация

Содержание

Слайд 2

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

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

называется IP (internrt pointer). IP – адрес состоит из 4 целых чисел от 0 до 255, разделенных точкой. Некоторые адреса имеют специальное назначение, например 127.0.0.1 –localhost – локальный адрес текущего компьютера.
192.168.XXX.XXX – адрес компьютера внутри локальной сети.
Но знать IP – адрес недостаточно, поскольку обмениваются информацией не компьютеры сами по себе, а приложения, работающие на них. Каждое программное приложение должно иметь свой номер – “номер порта”. Порт – это логическое соединение, через которое принимаются или отправляются данные.
Слайд 3

Большинство стандартных приложений имеют стандартные но-мера, например почтовый сервис привязан

Большинство стандартных приложений имеют стандартные но-мера, например почтовый сервис привязан к

порту 25 (как гово-рят «слушает порт 25»), веб-сервис привязан к порту 80, FTP – к 21 и т.д.
Номера портов до 1024 зарезервированы (заняты). Есть исключе-ния, например 3128 – порт прокси-сервера.
Передача информации между компьютерами (точнее между процессами) осущест­вля­ет­ся через сокеты. Socket (гнездо, разъ-ем) с точки зрения программы – это объект, осуществляющий пе-ресылку данных с одного конца линии связи на другой, от одного процесса к другому.
Основными параметрами сокета являются номер компьютера и номер порта, эта ком­би­на­ция идентифицирует сокет.
Слайд 4

Компьютеры по сети обмениваются пакетами, которые содержат адрес отправителя, адрес

Компьютеры по сети обмениваются пакетами, которые содержат адрес отправителя, адрес получателя

и собственно данные (+слу-жебная информация).
Как правило взаимодействие осуществляется по схеме клиент-сервер: клиент запрашива-ет какую-либо информацию, а сервер принимает запрос, обрабатывает его и отсылает клиенту результат.
Обмен информацией по сети определяется протоколами. Протокол – это набор сог­лаше­ний и правил обмена данными между программами. Протокол определяет очеред­ность дейст­вий, позволяющую осуществлять соединение и обмен данными между уст­рой­ствами и процес­сами. Порт – это один из пара- метров протокола.
Слайд 5

Протоколы бывают разных уровней и работают друг с другом в

Протоколы бывают разных уровней и работают друг с другом в стеке:

протокол, располагающийся на уровне выше, работает поверх нижнего.
Например: IP – протокол сетевого уровня. Задача этого уровня – доставка пакетов от компьютера-отправителя к компьютеру-по-лучателю. Номера портов на сетевом уровне не используются. Какому порту адресован пакет, был ли он доставлен, на этом уровне не известно.
TCP и UDP – протоколы транспортного уровня, они используют номер порта.
UDP – это протокол без установления соединения с негарантиро-ванной доставкой пакетов (типа: крикнул что-нибуь, а услышат тебя или нет – неважно). Сокеты, работающие по этому протоколу, называются дейтаграммные.
Слайд 6

TCP – протокол с установлением соединения и гарантированной доставкой пакетов.

TCP – протокол с установлением соединения и гарантированной доставкой пакетов. Сна­чала

производится обмен специальными пакетами для установления соединения. Да­лее по это­му соеди-нению туда и обратно отсылаются пакеты, причем с проверкой, дошел ли пакет до по­лучателя. Если пакет не дошел, то он посы-лается повторно. Сооответст­ву­ю­щие сокеты назы­ва­ются поточ-ными.
Над транспортным уровнем находится прикладной уровень. На этом уровне работа­ют та­кие протоколы как http, ftp и другие.
Слайд 7

ПРОТОКОЛ TCP Сокет TCP может быть серверным или клиентским. Первый

ПРОТОКОЛ TCP

Сокет TCP может быть серверным или клиентским. Первый про-слушивает порт

с некоторым номером, ожидая подключения со стороны клиентов, а второй (со стороны клиента) пытается под-ключиться к серверному сокету.
Приняв запрос на подключение, процесс – сервер создает для нового клиента со своей стороны также клиентский сокет, через который продолжает общаться с клиентом.
Сокеты могут работать в блокирующем и неблокирующем ре-жиме.
Слайд 8

В первом случае выполнение потока, в котором работает сокет, блоки-руется

В первом случае выполнение потока, в котором работает сокет, блоки-руется до

окончания выполнения очередной операции. Во втором случае используется программирование, управляемое событиями.
В библиотеке Qt для работы с сокетами имеется модуль QtNetwork, который необ­хо­ди­мо подключит командой #include.
Перед компиляцией программы в файле проекта *pro необхо-димо добавить строку:
QT += network
Слайд 9

АЛГОРИТМ РАБОТЫ С СЕРВЕРНЫМ СОКЕТОМ Создать экземпляр класса QTcpServer; Перевести

АЛГОРИТМ РАБОТЫ С СЕРВЕРНЫМ СОКЕТОМ

Создать экземпляр класса QTcpServer;
Перевести сервер в слушающее

состояние.
Перевести сервер в состояние ожидания запроса на подключение.
Когда клиент подключился:
Создать сокет для связи с клиентом (с помощью класса QTcpSocket) и проинициализировать его.
Ждать прихода запроса от клиента.
Если данные пришли, прочитать их.
Слайд 10

ПРИМЕР Консольное приложение: эхо-сервер в блокирующем режиме Создать консольное приложение

ПРИМЕР

Консольное приложение:
эхо-сервер в блокирующем режиме

Создать консольное приложение Qt.
стереть лишние команды

из файла main.cpp
файл main.cpp
#include
#include
#include
#define STR(s) ((codec->fromUnicode(s)).constData())
using namespace std;
Слайд 11

int main(int, char**) { QTextCodec* codec = QTextCodec::codecForName("CP866"); //qDebug() //QTextCodec::setCodecForLocale(QTextCodec::codecForName("CP866"));

int main(int, char**)
{
QTextCodec* codec = QTextCodec::codecForName("CP866");
//qDebug() << "Отладка";
//QTextCodec::setCodecForLocale(QTextCodec::codecForName("CP866"));
//cout <<

QString::fromUtf8("Проверка:\n").toLocal8Bit().data() << endl;
// qDebug() << "Отладка"; // Выводит в то же окно, что и cout
QTcpServer server;
server.listen(QHostAddress::Any, 1234);
cout << STR("Сервер запущен\n");
// каждые 5 сек выводится сообщение:
while (!server.waitForNewConnection(5000))
// все функции wait блокируют работу потока
cout << STR("Ожидание запроса на подключение клиента\n");
Слайд 12

QTcpSocket* client; // Клиентский сокет QHostAddress addr; // Адрес клиента

QTcpSocket* client; // Клиентский сокет
QHostAddress addr; // Адрес клиента

QByteArray block; // Блок для обмена данными
/*Для подтверждения соединения с клиентом необходимо вызвать метод nextPendingConnection(), который возвратит сокет, посредством кото-рого можно осуществлять дальнейшую связь с клиентом: */
client = server.nextPendingConnection(); //pending - ожидающий
// подключение произошло, создаем для него новый сокет:
addr = client->peerAddress(); // определяем адрес клиента
cout <
Слайд 13

forever // позволяет повторить процесс получения строки { forever //

forever // позволяет повторить процесс получения строки
{
forever // ожидание поступления

данных
{
if (!client || !client->isValid() || client->state() == QAbstractSocket::UnconnectedState)
{
cout << STR("Клиент отключился\n");
return 0;
}
if (client->waitForReadyRead(1000))
// в течение 1 сек ждем прихода данных
{
block = client->readAll(); // считываем данные
cout << block.data()<< endl;
break;
}
}
Слайд 14

client->write(STR("Эхо: ")); client->write(block); client->write("\n"); client->waitForBytesWritten(); } return 0; }

client->write(STR("Эхо: "));
client->write(block);
client->write("\n");
client->waitForBytesWritten();
}
return 0;
}

Слайд 15

Консольное приложение: клиент #include #include #include #define STR(s) (codec->fromUnicode(s).constData()) using

Консольное приложение: клиент

#include
#include
#include
#define STR(s) (codec->fromUnicode(s).constData())
using namespace std;
int

main(int , char **)
{
QTextCodec* codec = QTextCodec::codecForName("CP866");
Слайд 16

QTcpSocket socket; QByteArray block; QString server = "127.0.0.1"; int port

QTcpSocket socket;
QByteArray block;
QString server = "127.0.0.1";
int port

= 1234;
socket.connectToHost(server, port);
cout << STR("Клиент запущен\n");
forever
{
cout << STR("Введите строку\n");
char text[81];
cin.getline(text, 80);
socket.write(text);
socket.waitForBytesWritten();
Слайд 17

forever { if (socket.waitForReadyRead(1000)) { block = socket.readAll(); cout break; } } } return 0; }

forever
{
if (socket.waitForReadyRead(1000))
{
block = socket.readAll();
cout << block.data();
break;
}
}

}
return 0;
}
Имя файла: Программирование-передачи-информации-между-компьютерами-по-сети.-Клиент-серверные-приложения.pptx
Количество просмотров: 24
Количество скачиваний: 0