Обмен сообщениями. Чат с нуля.

Дисклеймер: в данном посте приведен простейший способ организоваться обмен сообщениями с «нуля» и, конечно, он сильно-сильно упрощен, тем не менее, людям начинающим знакомиться с программированием это может быть интересным.

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

Общая схема будет следующая:

Историю сообщений будем хранить на сервере (возможна так же реализация, с хранением истории на устройствах или вообще без хранения, но об этом, в другой раз).

Небольшое пояснение схемы: User 1 отправляет сообщение на север, выполняя запрос, после чего скрипт на сервере записывает сообщение в базу данных (для простоты будем использовать обычный текстовый файл), User 2 выполняет запрос истории сообщений, и сервер читает файл и возвращает данные пользователю User 2.

Обращаться к серверу будем посредством HTTP-запросов, так мы обычной работаем с сайтами. Например, когда направляем поисковый запрос он передается на сервер посредству HTTP запроса методом GET

После знака вопроса (?) следуют параметры, которые отделяются амперсандом (&). Тем не менее у GET запроса есть ограничение на количество символов в запросе. Около 4000 символов при использовании Apache HTTP-сервера (одного из наиболее распространенных).

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

В целом, если упростить и отбросить нюансы, метод GET следует использовать для получения каких-либо данных, а POST для отправки.

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

Клиент (приложение)

Клиенту как минимум необходимы две функции:

  1. Отправки сообщения
  2. Получение истории

Итак, функция для отправки сообщения будет получать на вход сообщение и в случае успеха возвращать сообщение ‘сообщение отправлено’

def send(mes): #объявляем функцию 
    data = {'name': NAME, 'mes': mes} #формируем словарь с данными 
    parameter = parse.urlencode(data) #готовим данные для отправки, используя библиотеку
    f = request.urlopen(URL_OPEN, parameter.encode('utf-8')) #отправляем запрос
    return('сообщение отправлено')

Теперь функция получения истории:

def update(): #объявляем функцию 
    data = {'w': 1} #формируем словарь с данными 
    parameter = parse.urlencode(data) #готовим данные для отправки, используя библиотеку
    f = request.urlopen(URL_UPDATE+parameter) #отправляем запрос
    str_history = str(f.read().decode('utf-8')) # считываем данные и указываем кодировку
    return(str_history) #возвращаем историю сообщений

Из основного все, но необходимо еще подключить библиотеку urllib и указать значение констант, которые используются в нашем клиенте, это адрес(URL) скрипта для обработки сообщения(URL_SEND), обновления чат а(URL_UPDATE) и имени пользователя (NAME).

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

NAME = 'ILIYA' #здесь необходимо вписать Ваши данные
URL_SEND = 'http://lyzhin.pw/example/send.php' #здесь необходимо вписать Ваши данные
URL_UPDATE = 'http://lyzhin.pw/example/update.php?' #здесь необходимо вписать Ваши данные
HELP = ''' ### Клиент для простейшего чата ###
0 - для выхода
1 - для отправки сообщения
2 - для обновления чата'''
from urllib import request, parse #Подключаем библиотеку
k=1
while (k!=0): #пока k не 0, выполняем цикл
    print(HELP)  #выводим инструкцию 
    k = int(input())   #считываем номер команды
    if (k==1): #если 1, то команда - отправка сообщения
        mes = input() #считываем сообщение
        print(send(mes)) #вызываем функцию send и выводим на экран её результат
    if (k==2): #если 1, то команда - обновление часта(получение истории сообщений)
        print(update())  #вызываем функцию update и выводим на экран её результат(историю сообщений)

Итоговый результат

Код
Вывод в консоль

Сервер

Потребуется любой хостинг с поддержкой PHP. И два скрипта один сохраняющий сообщение, другой читающий историю. Получение и сохранение сообщения:

<?php
    $mes = $_POST["mes"]; // считываем сообщение
    $name = $_POST["name"]; // считываем имя пользователя
    $time = date("H:i:s"); // получаем текущее время
    $text = "$time :: $name > $mes \n"; // формируем строку для записи в файл содержащую время, имя отправителя и сообщения \n - символ новой строки
    $fp = fopen("db.txt", "a"); // открываем файл на дозапись
    fwrite($fp, $text); //записываем строку
    fclose($fp); // закрываем файл
?>

Вывод истории

<?php
	if($_GET["w"]==1){
        readfile("db.txt"); //считываем и выводим содержимое файла
    }
?>

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

$fp = fopen("db.txt", "w");

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *