Вверх ↑
Этот топик читают: Гость
Ответов: 1328
Рейтинг: 69
#91: 2014-08-28 10:41:34 ЛС | профиль | цитата
ruin, открывай => помощь => Internet => SendFile таким же макаром и через этот компонент, обрати внимание должен быть DataType=dtStream
карма: 2

0
Ответов: 4630
Рейтинг: 749
#92: 2014-08-28 14:14:59 ЛС | профиль | цитата
Через некоторое время будут дополнительные компоненты, на базе текущих, умеющие отправлять файлы и строки без дополнительных плясок с бубном.
карма: 26

1
Голосовали:Konst
Гость
Ответов: 17029
Рейтинг: 0
#93: 2014-08-28 17:19:55 правка | ЛС | профиль | цитата


Редактировалось 7 раз(а), последний 2022-09-20 00:18:33
карма: 0

0
Ответов: 209
Рейтинг: 1
#94: 2015-01-24 23:36:24 ЛС | профиль | цитата
Спрошу тут

Пытаюсь осознать каким методом решить одну ошибку.
Схема цикличная и шлет каждые 300мск картинку по tcp, при хорошей связи нет необходимости что-то менять, все работает замечательно. Но стоит смоделировать плохую связь (wi-fi) как в подвисший tcp накидывает данные и происходит краш приложения.
Подскажите каким вариантом можно приостанавливать подачу в tcp при плохом соединении ?
карма: 0

0
Ответов: 1328
Рейтинг: 69
#95: 2015-01-25 07:33:01 ЛС | профиль | цитата
проверяй сервер на доступность, потом отправляй Ping
карма: 2

0
Ответов: 209
Рейтинг: 1
#96: 2015-01-25 11:35:58 ЛС | профиль | цитата
Konst, не мог бы схематично подсказать цепочку ?

не совсем понимаю как проверять на доступность. в моем понимании только пинг и по его результату...

таким образом ?

code_34976.txt


карма: 0

0
файлы: 1code_34976.txt [765B] [639]
Ответов: 1328
Рейтинг: 69
#97: 2015-01-27 15:55:58 ЛС | профиль | цитата
тут наверное пинг не нужен, попробуй как то так:

code_34985.txt
карма: 2

1
Голосовали:Net2Com
Ответов: 209
Рейтинг: 1
#98: 2015-01-28 19:59:06 ЛС | профиль | цитата
Konst, еррор по ссылке
------------ Дoбавленo в 19.59:


картинку в потоке не получается отправить с конвертацией в стринг у этого компонента, как и в стандартном
у меня приходит не целая

как еще можно ее отсылать именно из потока?

пример прикреплен

Add(MainForm,2953706,602,301)
{
Width=268
Height=435
link(onCreate,14723994:doStartServer,[(692,321)(692,454)])
}
Add(MemoryStream,3864290,386,343)
{
}
Add(Jpeg,4939507,386,413)
{
Quality=100
Point(doLoadFromBitmap)
Point(doSaveToStream)
Point(Stream)
Point(FileName)
Point(Quality)
link(Stream,4852169:Var2,[])
}
Add(DoData,16742384,470,441)
{
link(onEventData,12001245:doConvert,[])
link(Data,4852169:Var3,[(476,397)])
}
Add(Convertor,12001245,519,441)
{
Mode=11
link(onResult,15045910:doSend,[])
}
Add(TCPClient,15045910,588,441)
{
IP="127.0.0.1"
Port=123
SendTimeout=50
Point(onErrorConnect)
Point(onErrorSend)
Point(Socket)
}
Add(TCPServer,14723994,749,441)
{
Port=123
Point(Port)
Point(onErrorStart)
Point(onStartServer)
link(onReceive,477730:doConvert,[])
link(onStartServer,11068579:doTimer,[])
}
Add(Convertor,477730,896,441)
{
Mode=12
link(onResult,9362269:doEvent1,[])
}
Add(Hub,6191688,315,427)
{
OutCount=3
link(onEvent1,4939507:doLoadFromBitmap,[])
link(onEvent2,4939507:doSaveToStream,[])
link(onEvent3,16742384:doData,[])
}
Add(Clipboard,10648336,224,357)
{
Point(PutBitmap)
link(PutBitmap,15928518:Bitmap,[])
}
Add(DoData,11598704,231,427)
{
link(onEventData,6191688:doEvent1,[])
link(Data,10648336:Bitmap,[])
}
Add(GetDataEx,4852169,386,392)
{
link(Data,3864290:Stream,[])
}
Add(Button,8392725,98,364)
{
Left=45
Top=300
Width=130
Height=50
link(onClick,8375957:doEvent1,[])
}
Add(Image,6573010,1099,428)
{
Width=245
Height=290
Color=9079434
Ctl3D=0
WinStyle=1
ViewStyle=4
Point(Handle)
}
Add(Jpeg,7040765,1001,427)
{
Quality=100
Point(Stream)
Point(doLoadFromStream)
Point(doBitmap)
link(onBitmap,6573010:doLoad,[(1066,433)(1066,434)])
}
Add(Hub,9362269,966,441)
{
link(onEvent1,7040765:doLoadFromStream,[])
link(onEvent2,7040765:doBitmap,[])
}
Add(Hub,8375957,168,364)
{
link(onEvent1,10648336:doPutBitmap,[])
link(onEvent2,11598704:doData,[(206,377)(206,433)])
}
Add(Timer,11068579,826,469)
{
Interval=500
Enable=1
AutoStop=1
link(onTimer,15045910:doConnect,[(878,475)(878,532)(576,532)(576,461)])
}
Add(Bitmap,15928518,224,308)
{
}




карма: 0

0
Ответов: 1328
Рейтинг: 69
#99: 2015-01-29 22:58:00 ЛС | профиль | цитата
Net2Com, см помощь-примеры-Internet-SendPicture.sha
карма: 2

0
файлы: 1code_34985.txt [1KB] [753]
Ответов: 209
Рейтинг: 1
#100: 2015-01-29 23:07:38 ЛС | профиль | цитата
Konst, в примере stream используется, а нужен стринг т.к этот компонента только в стринге идет

а стрим через конвертацию которая и рвет картинку как мне кажется
карма: 0

0
Ответов: 655
Рейтинг: 18
#101: 2015-03-08 22:34:15 ЛС | профиль | цитата
Netspirit, я на базе вашего компонента делаю web сервер, схема которая работает с клиентами(браузерами)находится в мультике.
При подключении клиента анализирую заголовки, смотрю что запрашивает, если страницу- выдаю страницу, если скрипт -то скрипт.

Когда браузер получил нужные данные - соединение закрывается, либо браузером либо принудительно на стороне сервера.

Во время тестов нашел интересный баг в своей схеме...- клиент подключился и ничего не шлет, получается открытый сокет "мертвый" коннект, что собственно не хорошо.

Не могли бы вы посоветовать как реализовать таймаут по которому соединение должно закрываться?

Помещать в мультик обычный таймер и запускать его по onClientConnect или есть другие варианты?


------------ Дoбавленo в 22.34:
Может использовать DefferedEvent?
карма: 0

0
Ответов: 4630
Рейтинг: 749
#102: 2015-03-09 11:31:38 ЛС | профиль | цитата
1) С каждого клиента по приеме данных фиксировать дату последних данных
2) Поставить таймер, который периодически пробегает каждого клиента и сравнивает сохраненную дату с текущей
3) Если превышает заданный период - отключить


Gunnman писал(а):
получается открытый сокет "мертвый" коннект, что собственно не хорошо
Не очень представляю, почему плохо. Думаю, схему нужно делать таким образом, чтобы она зависела от "действий" клиента, а не от "бездействий". Клиент ничего не делает - и сервер ничего не делает. Хотя чисто чтобы уменьшить нагрузку, таких клиентов стоит отключать (в текущем сервере неоптимальное использование потоков для прослушки данных от клиентов)
карма: 26

0
Ответов: 655
Рейтинг: 18
#103: 2015-03-10 00:52:18 ЛС | профиль | цитата
Netspirit писал(а):
Не очень представляю, почему плохо


На сколько я понимаю TCP количество сокетов в системе тоже органиченно, процессором, оперативной памятью, процессором и буфером сетевой карты и настройками ОС.

Я когда-то тестировал web приложение в одной фирме, все работало как надо, но потом я решил открыть несколько тысяч сокетов - приложение вывалилось, потому что небыло ограничений на кол-во сокетов которое можно открыть с 1 ip адреса)) т.е. получилось некоторое подобие DDOS) хотя по факту сокеты должны были просто перестать открываться)

Это все лирика перейду к сути вопроса:

Допустим есть html страница на которой есть скрипт, css стиль, картинка.

При загрузке страницы браузер в несколько соединений спрашивает у сервера:

1) Саму страницу
2) Скрипт
3) css стиль
4) картинку
5) запрос который выполняет скрипт с страницы (postget не важно)

мини лог 1 соединения (загрузка 1 страницы):

CurClientID;запрос

38776654;page.html
58776655;script.js
38776655;style.css
58776656;image.jpg
58776655;(пост_запрос)


Судя по логу:
58776655;script.js
58776655;style.css
58776655;(пост_запрос)

клиент с ID 58776655 делает 3 запроса последовательно.

Вопросы:

1)
Для того чтобы что-то ответить клиенту (браузеру в моем случае) мне необходимо указать ClientID, перед отправкой данных...как выбрать "нужный" ClientID?
Запрашивается 2 файла и 1 ответ на запрос скрипта, все запросы с соединений с одинаковым ID...просто отвечать ему в том же порядке в котором он спрашивает?
т.е. отправляю клиенту c ID 58776655 сначала script.js, затем этому же ID style.css и т.д.?
А он (браузер) уже дальше сам разберется с полученными данными?
п.с. Проверял через doEnumClients - там тоже 3 одинаковых клиента числятся.

2) Как закрыть конкретное соединение в этом случае?
Например соединение в котором я отдал скрипт - не закрылось автоматически (браузеры тоже иногда Connection: close "мимо ушей" пропускают), как его закрывать...
если закрою по ID 58776655 - могу передачу других файловданных прервать..

3) Правильно ли схему следующим образом: На каждый запрос клиента - отдельный экземпляр схемы (в данный момент использую именно этот вариант)?

4) Можно ли настроить альтернативный сервер таким образом чтобы каждое подключение имело уникальный CurClientID?
Это бы очень упростило работу с WEB приложениями...при использовании TCP клиента стандартногоальтернативного - все CurClientID с 1 ip адреса разные как и положено...а при использовании в качестве клиента браузера попадаются одинаковые.
Я не берусь утверждать ни в коем случае, но может это баг?


п.с. причем данные которые поступают с одинаковым CurClientID не в одном соединении происходят последовательно...а в разных т.к. при запросе 1 страницы количество активных соединений = количеству запрашиваемых файлов.






карма: 0

0
Ответов: 4630
Рейтинг: 749
#104: 2015-03-10 11:40:45 ЛС | профиль | цитата
Gunnman писал(а):
чтобы каждое подключение имело уникальный CurClientID?
Это уже есть и для этого введено понятие ClientID. CurClientID на момент всех событий всегда содержит ID клиента, от которого это событие произошло.
Gunnman писал(а):
а при использовании в качестве клиента браузера попадаются одинаковые
Здесь нет ничего необычного - браузер тоже экономит соединения. Кроме того, для протокола HTTP это штатная возможность, обеспечивается заголовком Connection: Keep-alive. Этот заголовок указывает серверу не разрывать соединение после ответа. Вероятно, это же должен делать клиент, если получит такой заголовок от сервера. Ну и разрыв соединения при Connection: close.

Gunnman писал(а):
как выбрать "нужный" ClientID?
Ты неизбежно столкнешься с тем, что данные от клиента приходят порциями и в случае сервера, вперемешку от разных клиентов. Схему нужно строить таким образом, чтобы сохранять изолированное "состояние" каждого клиента. То-есть, когда данные приходят частями (для примера, 1 соединение), тебе по-любому нужно накапливать некоторое количество данных и после каждого фрагмента анализировать накопленные данные с целью получить полные заголовки запроса (накапливать до получения двух переводов строки). Если запрос GET, ты можешь начинать отправлять ответ. Если POST - смотришь Content-Length и продолжаешь накапливать данные, пока не получишь эту длину. Отправляешь ответ и снова переключаешься на ожидание двух переводов строки. Сделать это можно, например, динамическим мультиком:
- подключился клиент - добавили копию схемы в мультик, в схеме сохранили CurClientID для дальнейшего сопоставления
- отключился клиент - удалили схему
- получили любое другое событие - взяли CurClientID, в цикле перебрали все копии схемы в мультике, по нему нашли нужную и сделали её текущей, передали в нее событие на обработку.
- внутри каждой схемы в мультике и выполнять обработку привязанного соединения.
карма: 26

0
Гость
Ответов: 17029
Рейтинг: 0
#105: 2015-03-10 17:08:49 правка | ЛС | профиль | цитата


Редактировалось 7 раз(а), последний 2022-09-20 00:18:33
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)