gifts2017

Вариант UDP Чата для 1С

Опубликовал Григорий (SodaWater) в раздел Программирование - Внешние компоненты

Внешняя компонента для обмена сообщениями в сети по udp-протоколу.
Также может быть использована в качестве log-сервера для сбора и обработки логов с оборудования(напр. cisco).

Основные свойства компоненты:

isEnable - возвращает 1, если открыты сокеты и можно отправлять/принимать данные

Методы:

Enable(ПортНомер)  - открывает выбранный порт для входящих сообщений и устанавливает свойство isEnable=1

Sendto(Адрес,Порт,Сообщение)  - посылает данные на удаленный сокет

Disable - прекращает прием/отправку и закрывает порты

Ограничения:

1. Не поддерживается(пока) рестарт чата "на лету",  если использовали метод Disable, то Enable работать не будет до закрытия 1С.

2. Ограничение на длину сообщения - 512 символов

3. В "хвосте" каждого сообщения есть служебная информация вида:

500:port:27015 recvfrom->192.168.0.77::37420

500 - количество символов в пришедшем пакете (без учета "хвоста")

:port:27015 - на этом порту удаленный комп. ждет ответных сообщений

 recvfrom->192.168.0.77::37420 - адрес и порт, с которого пришли данные(на этот порт не надо ничего отправлять, он для информации)

Пример использования под 7.7:

// файлик лежит в КаталогеИБ

ЗагрузитьВнешнююКомпоненту("Udptor.dll"); 
Чат = СоздатьОбъект("Addin.Chat");

// Открываем порт для приема сообщений

 Чат.Enable("27015");

// Проверяем результат

Если Чат.isEnabled=0 Тогда

Сообщить("Ошибка при открытии порта!");

КонецЕсли;

// Отправка сообщений

Процедура ОтправитьСообщение(Адрес,Порт,Сообщение)

Если Чат.isEnabled = 0 Тогда

Сообщить("Сервер не запущен!");
Возврат;

КонецЕсли;

Чат.Sendto(Адрес,Порт,Сообщение);

КонецПроцедуры

// Например

ОтправитьСообщение("192.168.0.77","27015","Это тестовое сообщение");

// Обработку входящих сообщений производим в процедуре 

Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные) 

Если Источник = "UdptorChat" И Событие = "Server" Тогда

Сообщить(Данные);

ИначеЕсли Источник = "UdptorChat" И Событие = "Error" Тогда

Сообщить("Ошибка !"+Данные);

КонецЕсли;

КонецПроцедуры

 

Использование в 1С 8:

1. Копируем компоненту на локальный диск

2. Регистрируем командой regsvr32 "путь к компоненте"\udptor.dll

В процессе регистрации возможно появление ошибки " не найдена точка входа..." при этом компонента будет работать. С ошибкой еще не разобрался, появляется и на Win2k и на XP, но редко.

Запуск в 8-ке

Результат = "";
ИмяВК="AddIn.Udptor";
Попытка

ПодключитьВнешнююКомпоненту(ИмяВК);

Результат = 1;

Исключение

Сообщить("Не удалось загрузить внешнюю компоненту по причине: "+ОписаниеОшибки());

КонецПопытки;
Сообщить(Результат);
Чат = Новый ("AddIn.Chat");

// Далее работаем как в 7.7 ч.з. обработку событий

 

Скачать файлы

Наименование Файл Версия Размер
Udptor.dll 124
.dll 84,00Kb
07.05.10
124
.dll 84,00Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Nicholas Mikuslas (Nicholas) 11.05.10 10:20
Пока не понял зачем это нужно, но реализация понравилась.
2. Григорий (SodaWater) 11.05.10 21:52
Мне пригодилось для решения след.задач:
1. Обмен сообщениями м\у польз. 1С, независимо от платформы 7.7 или 8 (теоретически должно работать и в терминале, если открыть на каждого юзера терм.сервера отдельный порт, проверю в ближ. время)

2. Как дополнение к 1. - обмен управляющими сообщениями типа "ЗакрытьПрограмму" и т.д.

3. Регистрация различных событий на центральном лог-сервере( syslog на bsd), вход/выход/изменение данных и т.д. При наших 350+ 1С юзерах в 25 распределенных базах очень неудобно отвечать на вопросы - "а кто исправил этот документ?"

4. Решение задач типа:
Покупатель спрашивает "В этом магазине нет нужного товара, а в каком он еще есть в наличии?", при этом не тянуть к себе все базы всех 25 филиалов.

5. Лог сервер на базе 1С 7.7(понятно, что это не лучшее решение), обрабатывает ежедневно 2млн. сообщений от других систем, включая коммутаторы и маршрутизаторы cisco.
Свой; +1 Ответить
3. Олег Филиппов (comol) 30.05.10 15:04
А исходники можешь прислать? Хочется чуть модифицировать. Модифицированное могу прислать, получится прямо GPL. Действительно нужная штука, но с 0 не осилил бы писать, не силён в особенностях ВК 1С.
4. dushelov (Душелов) 30.05.10 16:18
5. Григорий (SodaWater) 31.05.10 10:56
Это вариант для нелюбителей дот.нет )
И мне нужно было приимать\отправлять независимо от открытых\закрытых форм.
6. dushelov (Душелов) 31.05.10 12:25
(5) Так использовать глобальные переменные с объектом и все :)
7. Григорий (SodaWater) 31.05.10 13:45
Не догнал как использовать глобальные переменные с объектом. Если нужно принимать данные без открытия каких-либо форм. ((
Ну раз можно, значит - можно )
8. Serj (Serj1C) 06.09.11 15:55
1) Нет примера внешней обработки
2) Роняет 1С (8.2.13, win7) не методе Чат.Enable(СлушатьПорт);
9. Serj (Serj1C) 06.09.11 15:58
3) Роняет 1С при неоднократном повторном вызове Disable с ошибкой "Ошибка сетевого доступа к серверу, или приложение не вызвало WSAStartup, или ошибка произошла в WSAStartup"
10. Григорий (SodaWater) 26.09.11 11:58
(9) Serj1C,
Ответил в личку, нужны уточнения.
11. Константин Гейнрих (CyberCerber) 03.10.11 13:05
А какими методами/событиями отлавливать получение сообщений?
12. Аркадий Кучер (Abadonna) 03.10.11 14:00
(0)
теоретически должно работать и в терминале, если открыть на каждого юзера терм.сервера отдельный порт

Не советую. Проще поставить UDP-сервер, я так в Miracle сделал.
Сервер слушает на один порт, а потом пересылает на другие порты, которые открываются для каждого юзверя при старте в терминале из незанятых
13. Steve Gordon (SGordon1) 03.10.11 15:48
А Порты TCP Можно так слушать?
14. Григорий (SodaWater) 06.10.11 22:42
Теоретически можно слушать и TCP, но не этой компонентой
15. Григорий (SodaWater) 06.10.11 22:45
Abadonna пишет:
...а потом пересылает на другие порты, которые открываются для каждого юзверя при старте в терминале из незанятых

(0)

Если в итоге на каждого юзера выделять отдельный порт, то думаю сервер лишнее звено.
16. Григорий (SodaWater) 06.10.11 22:50
Проект устарел, нет нормальных тестов под 7-ку(Win7), но сейчас есть куча времени(уволился) и добавлю новые функции по просьбам трудящихся )
17. Григорий (SodaWater) 06.10.11 22:54
Вопрос, на которы й не смог найти ответ - как отправлять UDP пакеты с определенного порта? Может кто решал такие задачи. Откликнитесь.
18. Сергей (berserg) 14.11.11 17:18
Что то она у меня не хочет работать на 64-разрядном сервере. Вызываю так:

Попытка
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаUDPTor", "UDPTor", ТипВнешнейКомпоненты.Native);
Чат = Новый ("AddIn.Chat");
Исключение
Возврат;
КонецПопытки;

и после строчки Чат = Новый ("AddIn.Chat"); вываливается в исключение изменение типа внешней компоненты ничего не меняет. Не подскажите в чем дело?
19. Григорий (SodaWater) 14.11.11 22:22
20. Андрей Акулов (DrAku1a) 28.03.12 12:38
(0), (3) да... исходнички бы... можно было бы в новом стиле NativeAPI написать...
21. sws sws (Wladymyr) 18.06.12 18:46
спасибо автору, полезная вещь
22. umka2008 (umka2008) 01.07.14 17:14
А как бы узнать методы типа слушать порт? У тебя на картинке есть кнопки Старт/Стоп.
Что в них?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа