Кибор » Кибор - Интегрированная среда разработки ботов » О программе Кибор » Версия 4.08 Создание сервера. Обмен данными между программами Кибор и EXE по схеме Клиент - Сервер - Клиент

Страниц (2): [1] 2 »
 

1. Kibor - 30 Марта, 2015 - 16:39:54 - перейти к сообщению
Дополнительные функции обмена данными позволяют настраивать соединение между программами Кибор или собранными EXE по схеме клиент - сервер или клиент - сервер - клиент.

Возможно соединение программ на одном компьютере, в одной посети и при наличие выделенного ip у машины на которой стоит серверная программа через интернет без промежуточного сервера.

если необходимо связаться с программой в сети интернет и нет выделенного IP необходимо использовать эти функции Обмен данными, контроль и управление другой программой по сети интернет.

Для создания сервера использовать функции

enablelistenport - включить прослушку порта
recvport - начали слушать. в отдельном потоке.
sendport - при получение сообщения в функции recvport можно ответить этой функцией
disablelistenport - отключить прослушку

синтаксис

 Цитата:
enablelistenport (10005);//включили прослушку 10005 порта (самому выбирать порт. должен совпадать с клиентским)

вернет больше 1 при удаче.

 Цитата:
char recvs[256];//массив в который принимаем
int flag_recv=0;// это флаг в котором будет 1 когда на сервер придет сообщение.
recvport (#recvs[0], 256, #flag_recv);//начали слушать. в отдельном потоке

вернет более 1 при удаче

 Цитата:
char sends[256];//массив который передаем
sendport (#sends[0], 256);//ответ клиенту. только если есть сообщение использовать.

вернет более 1 при удаче

 Цитата:
disablelistenport(); // при необходимости отключаем прослушку


узнать ip подсети можно набрав на машине сервера в пуск - выполнить - cmd /k ipconfig /all
ip надо указать в клиенте.

Нажмите для увеличения


пример программ клиент сервер
не забываем разрешать в брандмауэре
сервер
 Цитата:
///////диалог
int pos_size_edit0[2][4];
string text_edit0[2];

int pos_size_static0[2][4];
string text_static0[2];

pos_size_edit0[0][0]=110; pos_size_edit0[0][1]=10; pos_size_edit0[0][2]=218; pos_size_edit0[0][3]=20;
pos_size_edit0[1][0]=177; pos_size_edit0[1][1]=52; pos_size_edit0[1][2]=152; pos_size_edit0[1][3]=20;
text_edit0[0]=""; text_edit0[1]="О сервера клиенту мегаса";

pos_size_static0[0][0]=16; pos_size_static0[0][1]=14; pos_size_static0[0][2]=80; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=17; pos_size_static0[1][1]=55; pos_size_static0[1][2]=150; pos_size_static0[1][3]=20;
text_static0[0]="Сервер принял"; text_static0[1]="При приеме ответит клиенту";

createdialog(0, EDIT, #pos_size_edit0[0][0], #text_edit0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);
showdialog(0, "Сервер", 150, 200, 347, 117, 1, 1);

////////сам сервер

char recvs[256];//массив в который принимаем
char sends[256];//массив который передаем
int flag_recv=0;// это флаг в котором будет 1 когда на сервер придет сообщение

enablelistenport (10005);//включили прослушку 10005 порта (самому выбирать)
recvport (#recvs[0], 256, #flag_recv);//начали слушать. в отдельном потоке

enabletimer(0);//включили таймер

loop()//цикл бота
{
beep(2000, 70);
mu_pause (1000);
}

function mu_pause(int p)//реализация паузы что бы не зависал на время ее скрипт
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}

CREATE_TIMER(0, 50)
{
if (flag_recv==1)//если тут 1 - пришло сообщение
{
flag_recv=0;//обнулим
text_edit0[0]=format(#recvs[0]);//запишем это сообщение в edit
strcpy(#sends[0], text_edit0[1]);//заполним массив передачи текстом с второго edit
sendport (#sends[0], size(#sends[0]));//отправим
recvport (#recvs[0], 256, #flag_recv); // опять слушаем

}
}




клиент. о клиенте подробнее Отправки HTML запросов. Работа в интернете...
 Цитата:
int pos_size_edit0[2][4];
string text_edit0[2];
int pos_size_static0[2][4];
string text_static0[2];
int pos_size_button0[1][4];
string text_button0[1];
int flag_button0[1];

pos_size_button0[0][0]=16; pos_size_button0[0][1]=91; pos_size_button0[0][2]=313; pos_size_button0[0][3]=20;
text_button0[0]="Послать на сервер";

pos_size_edit0[0][0]=115; pos_size_edit0[0][1]=10; pos_size_edit0[0][2]=213; pos_size_edit0[0][3]=20;
pos_size_edit0[1][0]=157; pos_size_edit0[1][1]=52; pos_size_edit0[1][2]=172; pos_size_edit0[1][3]=20;
text_edit0[0]=""; text_edit0[1]="От клиента серверу пошлем";

pos_size_static0[0][0]=16; pos_size_static0[0][1]=14; pos_size_static0[0][2]=95; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=17; pos_size_static0[1][1]=55; pos_size_static0[1][2]=110; pos_size_static0[1][3]=20;
text_static0[0]="Получили в ответ"; text_static0[1]="Пошлем серверу";

createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0] |
EDIT, #pos_size_edit0[0][0], #text_edit0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);

showdialog(0, "Клиент", 350, 200, 347, 152, 1, 1);




char recvs[256];//массив в который принимаем
char sends[256];//массив который передаем

enabletimer(0);//включили таймер

int n=0;
loop()//цикл бота
{
textout(0, 50, 50, format(n), 0);
n++;
mu_pause (500);
}

function mu_pause(int p)//реализация паузы что бы не зависал на время ее скрипт
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}

CREATE_TIMER(0, 50)
{
if (flag_button0[0]>0)//если нажата кнопка
{
flag_button0[0]=0;//обнулим
/* Если на одном компьютере указать 127.0.0.1
если одна подсеть узнать ip запустив пуск выполнить cmd /k ipconfig /all
если интернеи и выделенный ip у сервака писать его ip*/
if (opensocket ("127.0.0.1", 10005)==1)//откроем сокет на 10005 порту сервера (самому выбирать)
{
strcpy(#sends[0], text_edit0[1]);//заполним массив передачи текстом с второго edit
if (sendhtml(#sends[0], size(#sends[0]))>0)//Если отправили
{
if (recvhtml(#recvs[0], 256)>0) text_edit0[0]=format(#recvs[0]);//когда примем ответ запишем ответ в edit
}
closesocket ();//Закрываем сокет
}
}
}


2. Flash - 28 Ноября, 2017 - 07:51:37 - перейти к сообщению
Здравствуйте ! а можно вычислить откуда пришло сообщение . то есть с какого ip ? например функция recvport принимает а sendport отправляет , вот и хотелось бы узнать куда на какой ip отправляется.
3. Kibor - 28 Ноября, 2017 - 09:33:02 - перейти к сообщению
Как вариант пусть в сообщение на сервер клиент отправляет свой ip, который можно узнать с помощью какого нибудь сервиса, послав на него запрос с помощью sendhtml и распарсить с ответа ip
4. Flash - 06 Декабря, 2017 - 18:42:35 - перейти к сообщению
Спасибо! буду иметь ввиду
5. Flash - 27 Февраля, 2018 - 08:14:42 - перейти к сообщению
Всем привет ! есть проблема с сервером может кто столкнулся с этим как решить? Суть, за основу возьму 2 примера с 1-й страницы (сервер, клиент), запускаю сервер, в клиенте делаю что бы постоянно отправлял запрос на сервер то есть (flag_button0[0]=0;//обнулим) удаляю что бы было в цикле и делаю паузу (1000-10000мс неважно), делаю 2 копии клиента в .exe, запускаю клиент пошёл процесс обмена, рано или позно клиент подвисает в ожидание ответа так как (opensocket) открыт и он ждёт ответа от сервера но сервер молчит, запускаю 2-ю копию клиента тоже сразу подвисает, в сервере flag_recv==1 после каждой отправки я проверял, а количество раз обмениваются сервер клиент от 300 - до нескольких тысяч, по разному но всегда клиент виснет, проверял через cmd команду на проверку стабильности интернета всё норм потеря пакетов 0. может кто что посоветует, мне кажется что что то с сервером надо делать. может через определённое время делать disablelistenport(); чтобы клиент отвис, типо перезагрузка ).
6. Kibor - 28 Февраля, 2018 - 04:46:08 - перейти к сообщению
Flash , код выложите.
7. Flash - 01 Марта, 2018 - 12:31:18 - перейти к сообщению
 Kibor пишет:
Flash , код выложите.

Здравствуйте! ну вот собственно код, на примерах выше. щас проверил подвис на передаче 1100, если запустить ещё копию клиент то тоже сразу подвисает, если выключить сервер клиент отвиснет.


CODE:
///////ñåðâåð
int pos_size_static0[2][4];
string text_static0[2];
int pos_size_button0[1][4];
string text_button0[1];
int flag_button0[1];

pos_size_button0[0][0]=10; pos_size_button0[0][1]=65; pos_size_button0[0][2]=120; pos_size_button0[0][3]=20;
text_button0[0]="ñòàðò";


pos_size_static0[0][0]=10; pos_size_static0[0][1]=15; pos_size_static0[0][2]=120; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=10; pos_size_static0[1][1]=40; pos_size_static0[1][2]=120; pos_size_static0[1][3]=20;
text_static0[0]="êîëè÷åñòâî çàïðîñîâ"; text_static0[1]="";

createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);

showdialog(0, "ñåðâåð", 350, 200, 147, 125, 1, 1);


char recvs[256];
char sends[256];
int flag_recv=0;


loop()
{
if(flag_button0[0]>0)goto 1;
sleep(30);
}

1:;
flag_button0[0]=0;



enablelistenport (10005);
recvport (#recvs[0], 256, #flag_recv);
enabletimer(0);



loop()
{
//beep(2000, 70);
mu_pause (1000);
}

function mu_pause(int p)
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}

CREATE_TIMER(0, 50)
{
if (flag_recv==1)
{
flag_recv=0;
text_static0[1]=format(#recvs[0]);
strcpy(#sends[0], text_static0[1]);
sendport (#sends[0], size(#sends[0]));
recvport (#recvs[0], 256, #flag_recv);

}
}






CODE:
///////êëèåíò
int pos_size_static0[2][4];
string text_static0[2];
int pos_size_button0[1][4];
string text_button0[1];
int flag_button0[1];

pos_size_button0[0][0]=10; pos_size_button0[0][1]=65; pos_size_button0[0][2]=120; pos_size_button0[0][3]=20;
text_button0[0]="ñòàðò";


pos_size_static0[0][0]=10; pos_size_static0[0][1]=15; pos_size_static0[0][2]=120; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=10; pos_size_static0[1][1]=40; pos_size_static0[1][2]=120; pos_size_static0[1][3]=20;
text_static0[0]="êîëè÷åñòâî îòâåòîâ"; text_static0[1]="";

createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);

showdialog(0, "êëèåíò", 350, 200, 147, 125, 1, 1);




char recvs[256];
char sends[256];
int k=0; ///// Ñ÷¸ò÷èê
string K;

enabletimer(0);

int n=0;
loop()
{
mu_pause (500);
}




function mu_pause(int p)
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}



CREATE_TIMER(0, 50)
{
if (flag_button0[0]>0)
{
//flag_button0[0]=0;


if (opensocket ("127.0.0.1", 10005)==1)
{
k++;
K=format(k);

strcpy(#sends[0], K);
if (sendhtml(#sends[0], size(#sends[0]))>0)
{
if (recvhtml(#recvs[0], 256)>0) text_static0[1]=format(#recvs[0]);
}
closesocket ();
}
}
pause(1000);
}
8. Kibor - 01 Марта, 2018 - 13:07:05 - перейти к сообщению
сервер
CODE:
///////диалог
int pos_size_edit0[2][4];
string text_edit0[2];

int pos_size_static0[2][4];
string text_static0[2];

pos_size_edit0[0][0]=110; pos_size_edit0[0][1]=10; pos_size_edit0[0][2]=218; pos_size_edit0[0][3]=20;
pos_size_edit0[1][0]=177; pos_size_edit0[1][1]=52; pos_size_edit0[1][2]=152; pos_size_edit0[1][3]=20;
text_edit0[0]=""; text_edit0[1]="О сервера клиенту мегаса";

pos_size_static0[0][0]=16; pos_size_static0[0][1]=14; pos_size_static0[0][2]=80; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=17; pos_size_static0[1][1]=55; pos_size_static0[1][2]=150; pos_size_static0[1][3]=20;
text_static0[0]="Сервер принял"; text_static0[1]="При приеме ответит клиенту";

createdialog(0, EDIT, #pos_size_edit0[0][0], #text_edit0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);
showdialog(0, "Сервер", 150, 200, 347, 117, 1, 1);

////////сам сервер

char recvs[256];//массив в который принимаем
char sends[256];//массив который передаем
int flag_recv=0;// это флаг в котором будет 1 когда на сервер придет сообщение

enablelistenport (10005);//включили прослушку 10005 порта (самому выбирать)
recvport (#recvs[0], 256, #flag_recv);//начали слушать. в отдельном потоке

enabletimer(0);//включили таймер

loop()//цикл бота
{
beep(2000, 70);
mu_pause (1000);
}

function mu_pause(int p)//реализация паузы что бы не зависал на время ее скрипт
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}

CREATE_TIMER(0, 50)
{
if (flag_recv==1)//если тут 1 - пришло сообщение
{
flag_recv=0;//обнулим
text_edit0[0]=format(#recvs[0]);//запишем это сообщение в edit
strcpy(#sends[0], text_edit0[1]);//заполним массив передачи текстом с второго edit
sendport (#sends[0], size(#sends[0]));//отправим
recvport (#recvs[0], 256, #flag_recv); // опять слушаем

}
}



клиент
CODE:
int pos_size_edit0[1][4];
string text_edit0[1];
int pos_size_static0[2][4];
string text_static0[2];
int pos_size_button0[1][4];
string text_button0[1];
int flag_button0[1];

pos_size_button0[0][0]=16; pos_size_button0[0][1]=91; pos_size_button0[0][2]=313; pos_size_button0[0][3]=20;
text_button0[0]="Послать на сервер значение переменной k";

pos_size_edit0[0][0]=115; pos_size_edit0[0][1]=10; pos_size_edit0[0][2]=213; pos_size_edit0[0][3]=20;
text_edit0[0]="";

pos_size_static0[0][0]=16; pos_size_static0[0][1]=14; pos_size_static0[0][2]=95; pos_size_static0[0][3]=20;
pos_size_static0[1][0]=17; pos_size_static0[1][1]=55; pos_size_static0[1][2]=170; pos_size_static0[1][3]=20;
text_static0[0]="Получили в ответ"; text_static0[1]="Пошлем серверу переменную k";

createdialog(0, BUTTON, #pos_size_button0[0][0], #text_button0[0], #flag_button0[0] |
EDIT, #pos_size_edit0[0][0], #text_edit0[0] |
STATIC, #pos_size_static0[0][0], #text_static0[0]);

showdialog(0, "Клиент", 350, 200, 347, 152, 1, 1);


int k=0;

char recvs[256];//массив в который принимаем
char sends[256];//массив который передаем

enabletimer(0);//включили таймер

int n=0;
loop()//цикл бота
{
textout(0, 50, 50, format(n), 0);
n++;
mu_pause (500);
}

function mu_pause(int p)//реализация паузы что бы не зависал на время ее скрипт
{
for (int t=gettime(); gettime()-t<p; sleep(10)){}
}

CREATE_TIMER(0, 50)
{
//if (flag_button0[0]>0)//ЗАКОМЕНТИРОВАЛИ
{
flag_button0[0]=0;//обнулим
/* Если на одном компьютере указать 127.0.0.1
если одна подсеть узнать ip запустив пуск выполнить cmd /k ipconfig /all
если интернеи и выделенный ip у сервака писать его ip*/
if (opensocket ("127.0.0.1", 10005)==1)//откроем сокет на 10005 порту сервера (самому выбирать)
{
k++;
if (k>9999999)k=0;
strcpy(#sends[0], format(k));//заполним массив передачи текстом с второго edit
if (sendhtml(#sends[0], size(#sends[0]))>0)//Если отправили
{
if (recvhtml(#recvs[0], 256)>0) text_edit0[0]=format(#recvs[0]);//когда примем ответ запишем ответ в edit
}
closesocket ();//Закрываем сокет
}
}
}


комментировал кнопку.
//if (flag_button0[0]>0)//ЗАКОМЕНТИРОВАЛИ
в цикле шлется переменная k
все нормально.
можно поменять при работе текст что сервер возвратит.
9. Flash - 27 Ноября, 2018 - 13:54:43 - перейти к сообщению
Здравствуйте! А можно ли через sendport отправлять что то помимо текстового сообщения? Например изображения архив или документы.
10. Kibor - 28 Ноября, 2018 - 01:30:37 - перейти к сообщению
Передаются байты, а не текст. Все файлы это байты.

Powered by ExBB FM 1.0 Final