Что нового

[Сеть, интернет] Идеи реализации общения программ через интернет.

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Здравствуйте, мне нужна помощь с идеями реализации обмена данных через интернет. Нужно сделать так, допустим есть 3 программы: "P1.exe,P2.exe,CL.exe".
P1.exe,P2.exe - устанавливаются на компьютере и имеют собственные идентификаторы "P1,P2" - Задача этих программ раз в 5 минут обменивается пакетами(Вот тут и проблема.).
Т.к выделенного сервера TCP/IP у меня нет, как можно решить эту проблему, и еще при "пинговании" они не должны зависать.
У меня есть на вооружении сервера: FTP, PHP. Возможно с помощью их можно что -то соорудить...
И еще, программы должны смотреть не пришли -ли на их адрес какое -то письмо.
"CL.exe" - Задача этой программы отправлять на адреса P1,P2 сообщения, например: "Привет :smile:"
Жду ваших идей.
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Думаю PHP самое то. Клиенты отправляют запросы на проверку и сами сообщения, а PHP сервер всё это дело обрабатывает) другое дело, что писать на AutoIt привычнее))
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
DarWiM
Плохо что я PHP не знаю...
Вот бы примерчики...
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Ganibal95
Да я в принципе только азы знаю. В любом случае нужно продумать как хранить переписку и прочие мелочи

ну а передачу информации на php сервер сделать не сложно, это или GET запрос или же банальный InetRead
 

Fever

Скриптер
Сообщения
308
Репутация
112
MySQL база на хостинге с удаленным доступом. На форуме есть библиотека INI_MySQL - как вариант, если с MySQL не знакомы.
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
DarWiM
У меня была идея создавать файл под идентификатор, но это можно взять как передача данных.
Тогда как определить когда какой идентификатор в сети?


Добавлено:
Сообщение автоматически объединено:

Fever
Вот с этим MySQL я не разу не сталкивался... Страшно... :stars:
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Ganibal95
Я когда-то думал как сделать подобное.. В принципе в запросе можно указывать логин или ид, выданный после авторизации. И время от времени слать запрос на продление статуса онлайн


Добавлено:
Сообщение автоматически объединено:

Fever
ужасно боюсь MySQL.. Делал через обычные текстовые файлы)
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
DarWiM
Вот это уже ближе :smile:
Тогда нужно сделать что -то что будет получать массив авторизованных и сверять время... Как это тогда придумать? :smile:
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Ganibal95
Это задумано как диалог для двоих или огромное количество бесед для разного количества участников? Думаю лучше начинать с простого)

p.s. Надо будет на днях попробовать сделать что-то подобное..)
p.s.2 Если это PHP, то он не будет запущен всё время, а значит нет необходимости хранить в себе массивы памяти. Он должен сохранять что-то куда-то


Добавлено:
Сообщение автоматически объединено:

У меня вопрос. В плане скорости что лучше, GET запрос или InetRead? :smile:
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
DarWiM [?]
У меня вопрос. В плане скорости что лучше, GET запрос или InetRead?
smiley.gif
Если ты будешь использовать как продление авторизации лучше всего InetGet('','',1,1) Запуск в фоне...
А вот получать сообщение лучше всего через InetRead() и php запрос.
Вот к примеру действия:
1. На php приходит запрос: ...php?log=123
2. php - > Откачивает в echo весь файл.
3. отчищает файл.
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Ganibal95
Набросал сегодня..
Код:
#include <String.au3>
#include <array.au3>
#include <GUIConstantsEx.au3>
Global $sDomen='http://localhost/new.php?'
Global $Key='UnRealPass'

#region CREATE GUI
$MainGUI = GUICreate('Прототип чата', 300, 400)
GUISetBkColor(0xAAAAAA)
$GUI_MyID = GUICtrlCreateInput('1', 5, 5, 40, 20, 0x2000 + 0x01)
GUICtrlSetFont(-1, 8, 800)
GUICtrlSetTip(-1,'My ID')
$GUI_ToID = GUICtrlCreateInput('2', 50, 5, 40, 20, 0x2000 + 0x01)
GUICtrlSetFont(-1, 8, 800)
GUICtrlSetTip(-1,'To ID')
$GUI_Start=GUICtrlCreateLabel('Старт', 100, 6, 195, 18, 0x0100 + 0x01)
GUICtrlSetFont(-1, 10, 600)
GUICtrlSetBkColor(-1, 0xffffff)
GUICtrlSetTip(-1,'Клааац')
GUICtrlCreateLabel('', 5, 30, 270, 250)
$GUI_Msg = GUICtrlCreateEdit("", 5, 30, 290, 250, 0x1000 + 0x4000 + 0x00800000 + 0x00200000 + 0x0040 + 0x0800)
GUICtrlSetFont(-1, 8, 800)
GUICtrlSetState(-1, $GUI_DISABLE)
$GUI_NewMsg = GUICtrlCreateEdit("", 5, 300, 290, 60, 0x0040)
GUICtrlSetFont(-1, 8, 800)
GUICtrlSetState(-1, $GUI_DISABLE)
$GUI_Send=GUICtrlCreateButton('О Т П Р А В И Т Ь', 5, 370, 290, 25)
GUICtrlSetFont(-1, 10, 600)
GUICtrlSetBkColor(-1, 0xffffff)
GUICtrlSetState(-1, $GUI_DISABLE)
Global $AccelKeys[1][2] = [["{ENTER}", $GUI_Send]]
GUISetAccelerators($AccelKeys)
GUISetState()

#endregion CREATE GUI

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_Start
			$MyID=GUICtrlRead($GUI_MyID)
			$ToID=GUICtrlRead($GUI_ToID)
			If $MyID=$ToID Then
				MsgBox(16,'Ошибка!','ID совпадают!',3)
				ContinueLoop
			EndIf
			GUICtrlSetData($GUI_Start,'')
			GUICtrlSetState($GUI_MyID,$GUI_DISABLE)
			GUICtrlSetState($GUI_ToID,$GUI_DISABLE)
			GUICtrlSetState($GUI_Start,$GUI_DISABLE)
			GUICtrlSetState($GUI_Msg,$GUI_ENABLE)
			GUICtrlSetState($GUI_NewMsg,$GUI_ENABLE)
			GUICtrlSetState($GUI_Send,$GUI_ENABLE)
			_Adlib_GetNewMsg()
			AdlibRegister("_Adlib_GetNewMsg", 5000)
		Case $GUI_Send
			$Msg=GUICtrlRead($GUI_NewMsg)
			$Msg_Time=_PHP_SendMsg($MyID,$ToID,$Msg)
			If IsString($Msg_Time) Then GUICtrlSetData($GUI_Msg, $Msg_Time&'>> '&$Msg&@CRLF,1)
			GUICtrlSetData($GUI_NewMsg, '')
	EndSwitch
WEnd

#region FUNC
Func _PHP_SendMsg($_sMyId,$_sSendTo,$_sText)
    If $_sText='' Then Return 0
    $_sUrl=$sDomen&'Do=SendMsg&MyId='&$_sMyId&'&SendTo='&$_sSendTo&'&Msg='&_StringEncrypt(1,$_sText,$Key)
    $_sAns=InetRead($_sUrl,1)
    If @error<>0 Then
        Return 0
    Else
		$_sAns=BinaryToString($_sAns)
        Return $_sAns
    EndIf
EndFunc

Func _PHP_GetNewMsg($_sMyId,$_sSender)
    $_sUrl=$sDomen&'Do=GetNewMsg&MyId='&$_sMyId&'&Sender='&$_sSender
    $_sAns=InetRead($_sUrl,1)
    If @error=0 Then
        $_sAns=BinaryToString($_sAns)
        If $_sAns='Error!' Then
            Return -1
        ElseIf $_sAns='Null' Then
            Return 0
        Else
            $_sAns=StringReplace($_sAns,@CRLF,'#')
            $_aAns=StringSplit($_sAns,'#')
            _ArrayDelete($_aAns,$_aAns[0])
            $_aAns[0]-=1
            Return $_aAns
        EndIf
    Else
        Return -2
    EndIf
EndFunc

Func _Adlib_GetNewMsg()
	GUICtrlSetData($GUI_Start, '...')
	Sleep(100)
	GUICtrlSetState($GUI_Send,$GUI_DISABLE)
	$_aMsg=_PHP_GetNewMsg($MyID,$ToID)
	If IsArray($_aMsg) Then
		For $i=1 To $_aMsg[0]
			$_sTime=StringRegExpReplace($_aMsg[$i],'(\[.*?\]\[.*?\]).*','\1')
			$_sMsg=_StringEncrypt(0,StringRegExpReplace($_aMsg[$i],'.*?\{(.*?)\}.*','\1'),$Key)
			GUICtrlSetData($GUI_Msg, $_sTime&'<< '&$_sMsg&@CRLF,1)
		Next
	ElseIf $_aMsg=-2 Then
		GUICtrlSetData($GUI_Start, 'Ошибка запроса')
	ElseIf $_aMsg=-1 Then
		GUICtrlSetData($GUI_Start, 'Диалог отсутствует')
	ElseIf $_aMsg=0 Then
		GUICtrlSetData($GUI_Start, 'Нет новых сообщений')
	EndIf
	Sleep(200)
	GUICtrlSetState($GUI_Send,$GUI_ENABLE)
	GUICtrlSetData($GUI_Start, '')
EndFunc
#endregion FUNC
P.S. Теперь с GUI, уже почти нормальный чат :smile:
P.S.2 Если несколько запустить с одинаковыми Id, то сообщения будут получать по принципу "кто быстрее". Поэтому нужно ID привязывать к логину и паролю.. И нужно придумать схему, чтоб ID был в сети не более, чем с одной копии программы.
Еще не хватает истории сообщений и статуса онлайн или хотя-бы времени последней активности..
 

xaker

Знающий
Сообщения
52
Репутация
16
а если сделать общение программ через jabber ?
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Ganibal95
Я очень жадный :smile: Но так и быть, вот он:
Код:
<?php
if (!empty($_GET["Do"]))
{	
	date_default_timezone_set('Europe/Kiev');
	if ($_GET["Do"]='SendMsg' and !empty($_GET["MyId"]) and !empty($_GET["SendTo"]) and !empty($_GET["Msg"]))
	{
		$f = fopen('Dialog_'.$_GET["MyId"].'-'.$_GET["SendTo"], "a");
		$pro=fwrite($f, date('\[d.m.y\]\[H:i:s\]').'{'.$_GET["Msg"]."}\r\n");
		if ($pro<>false)
		{
			echo date('\[d.m.y\]\[H:i:s\]');
			fclose($f);
		}
		else echo 'Error!';
	}
	elseif ($_GET["Do"]='GetNewMsg' and !empty($_GET["MyId"]) and !empty($_GET["Sender"]))
	{
		if (file_exists('Dialog_'.$_GET["Sender"].'-'.$_GET["MyId"])) {$f_name = 'Dialog_'.$_GET["Sender"].'-'.$_GET["MyId"];}
		else {echo 'Error!'; exit;}
		
		$lines=file($f_name);
		$msg='';
		foreach ($lines as $key => $line)
		{
			$msg.=$line;
		}
		if ($msg<>'') {$f=fopen($f_name,"w"); fclose($f);}
		else $msg='Null';
		echo $msg;
	}
	else {echo 'Bad attempt!';}
}
else echo 'Bad attempt!';
?>
p.s. убрал скрипт с хоста
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Друзья, что-то Вас куда-то понесло... Вы реально гоняете блох из BFG :smile:

Ganibal95, В вашем случае самый простой/элегантный выход - это использовать P2P паттерн.
Само собой самый упрощенный вариант этой концепции.
Поскольку сущности суть которых вам необходимо хранить/передавать, есть не что иное как адрес оппонента, а это ну в худшем случае строка, а в идеале хеш, и насколько я понял - миллионы таких программ вам связывать не предстоит, то реализация предлагается следующей:
Условия: Хотя бы один хост со статическим-белым IP
Модульность:
Можно разделить гуй-клиент от сервера-регистратора, хотя не стоит
Структура
1) Функционал для сохранения/чтения key-value данных (хоть в текстовый файл, само собой нужен будет простенький парсер) (нужно только для хранения / в процессе работы подержим все в памяти)
Будем сохранять хосты как ID - IP:blum:ORT
2) Функционал для работы с TCP
3) ГУЙ

Концепция
Каждое приложение автономно, и ведет себя следующим образом:
1) Запускаемся - читаем свой список, сюреализуем.
2) В фоновом режиме начинаем отправлять всем в списке сообщение о присутсвии, сообщаем всем свой
ID - IP:blum:ORT
1) Получаем из ГУЯ ID c которым необходимо соедениться
3) Ищем его в своем списке, если нет или есть, но соединиться не удалось (возможно там динамический IP или NAT) то...
4) Идем по своему списку, начиная с заведомо известного, запрашивая ID у них, получаем ответ - пробуем, нет, поехали дальше...
5) Удалось соедениться - сохраняем себе в табличку.
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
RUVATA
Я не много не врубаюсь, т.к тема для меня устарела.

Сейчас я полностью использую php...
php отличное решение для обмена данными между программами без хостирования сервера самому.
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Ganibal95 [?]
php отличное решение для обмена данными между программами без хостирования сервера самому.
Я не то чтобы против такого подхода, при поставленных задачах... Решение годное :smile: Но есть одно НО - Гаснет сервак вся инфраструктура в ауте. А всего-то и надо сообщения передавать.
PS: Децентрализация - true way в данном случае. По мне так сервер это базам данных хвосты крутить, рендерить, генерить... Максимум в данном случае как сервер согласования.
 
Верх