Перейти к содержанию

Гайд по RedPower. Low-level №4. Работа с сетью & дисками. Чат.


Alleksh

Рекомендуемые сообщения

Что может дать такая сеть из нескольких компов?
1) Ускорение заводов.
Ведь если несколько ПК будут одновременно работать с сортронами - завод будет работать быстрее, верно?
2) Создание баз данных.
К примеру - имеем мы сеть из 30 компов, а нам нужно обновить базу данных предметов. Неужели в каждый ПК добавлять данные?
В этом случае весьма полезны базы данных.
Покажу использование сетей на примере чата.
И так, давайте создадим чат. 
Примечание:
Данный чат можно реализовать и через один пк, используя несколько мониторов.

Идея:
Есть два вида устройств - сервер и клиент.
Сервер всего один, клиентов - множество.

Для начала напишем сервер.
Идея сервера:
Получаем ID устройства, куда отправить данные,  номер команды и получаемые данные.
Отправляем по указанному ID ответ.
Храним сообщения на диске.
Команды:
0 - отправить кол-во сообщений(записать в 0x301-0x302).
1 - отправить сообщение по номеру(берём из 0x403-0x404 номер, записываем в 0x301-0x3FF ответ).
2 - Получить сообщение - в 0x403-0x4FF находится сообщение.
Разметка сервера:
0x400 - ID
0x401 - номер команды
0x402 - Можно ли начинать работу?
0x403-0x4FF - получаемые данные.
0x300 - завершена ли работа?
0x301-0x3FF - данные клиента.
Реализация сервера:
Переменные:
VARIABLE NOW_SIZE
Для начала - напишем базу данных, для хранения сообщений:
HEX
: ADD_NEW_MESSAGE NOW_SIZE @ 1+ DUP NOW_SIZE ! BLOCK 70 MOVE FLUSH ;
: GET_MESSAGE BLOCK ;

Давайте добавим пару тестовых сообщений:
image.png.f1aba42a3f3c1944f10566e74051229d.png

Как можно увидеть, сообщения записались отлично:

image.png.fa1fbb79bf593e2faffaee439537cdc6.png
Давайте теперь доработаем наш сервер:
HEX

: CONNECT_TO_ID 400 C@ RBP! ; 
: PROCESS_COMMAND_0
CONNECT_TO_ID NOW_SIZE @ 301 ! ;
: PROCESS_COMMAND_1
403 C@ GET_MESSAGE 
CONNECT_TO_ID 301 70 MOVE ;
: PROCESS_COMMAND_2
404 ADD_NEW_MESSAGE CONNECT_TO_ID ;
: SWITCH_COMMAND
401 C@
DUP 0= IF DROP PROCESS_COMMAND_0 

ELSE DUP 1 = IF DROP PROCESS_COMMAND_1 

ELSE 2 = IF PROCESS_COMMAND_2 THEN THEN THEN ;
: START_SERVER

400 3 0 FILL

BEGIN

400 C@ 0<> 
IF BEGIN 402 C@ 0<>  UNTIL
SWITCH_COMMAND
CONNECT_TO_ID 1 300 C! 400 3 0 FILL
THEN KEY? UNTIL ;

Наш сервер готов!
Теперь давайте напишем клиент:
Для начала напишем функции для отправки/получения сообщений:
VARIABLE MYID
: CONNECT_TO_SERVER 0 RBP! ;
: SET_READY 1 302 C! ;
: WAIT_WHILE_EXECUTED BEGIN TICK 400 C@ 0<> UNTIL ;
: GET_SIZE 
CONNECT_TO_SERVER 0 301 C!
MYID C@ 300 C! 0 400 C! 
SET_READY
WAIT_WHILE_EXECUTED
401 @ ;
: RECEIVE_MESSAGE
CONNECT_TO_SERVER
1 301 C! 303 !
MYID C@ 300 C! 0 400 C! 
SET_READY WAIT_WHILE_EXECUTED 401 ;
: SEND_MESSAGE
CONNECT_TO_SERVER 2 301 C!
MYID C@ 300 C! 0 400 C! 
100 304 70 MOVE 
SET_READY WAIT_WHILE_EXECUTED ;
: SEND 100 80 ACCEPT SEND_MESSAGE ;

И так, код мы ввели.
Давайте всё это подключим:
image.thumb.png.023654ff70073f3d278b0b37bb4fe5aa.png
MYID у первого клиента - 5, у второго - 6.
Давайте протестируем!
image.thumb.png.c7bf3ba55f6152b162bdad43d66a0a6e.png
image.thumb.png.42e8bdc7547004abcc25271701d50ff8.png
Всё сработало отлично! Поздравляю!

Изменено пользователем Alleksh
  • Рейтинг 2
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...