Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Вниз

Как передать голос по сети и ..., Internet   Найти похожие ветки 

 
Whitevova ©   (2006-06-07 21:01) [0]

Я часто разговоравию сидя за компьютером, а занимать телефон на полчаса из-за какой-то ... не очень-то хочется. Вот и решил сделать что-то вроде TeamSpeak и аськи и лоадера и ... в одном лице. Создавать свои классы и методы соединения в первой версии проги не захотел. Решил просто посмотреть как работает сеть, и как вообше посылать, принимать ... сообшения, файлы... Обнем файлами и сообшениями решил сделать через Tclient и Tserver Socket"ы. Как чем пользоваться смотрел в DW. Вполне норм описано. Но столкнулся с некоторыми проблемами, решение которых не нашел, а может плохо искал. Так вот собственно и они:

1. Создал программу клиент - точнее заготовку - добавил пару закладок ... наметил обший вид. Посмотрел в DW как посылать/принимать сообшения - сделал "чат" ( ну недоработанный абсолютно - г..но), но работает так: запускаю прогу серв - включаю сервер, запускаю клиент - присоединяюсь, пишу сообшение, а оно видно и в клиенте и в программе сервере. Обрадовался - хотел делать норм. обмен и т.д. Но подумал, а вдруг с другого компа не коннектиться и скинул клиент другу - включил серв - и на тебе - правда - неконнект. Вот она - первая проблема.

2. При отправке сразу нескольких пакетов данных они слипаются в один. Но на этот случай в DW много решений - выбрал наиболее удобное - а оно не работает - точнее тот код, который написан в DW

----------------------------------------------------------------------------------------------------------------------------------
var
Buffer: string = "";
{$R *.dfm}

function GetUserStringFromBuffer(var UserString: string): Boolean;
var
i: Integer;
bf: string;
begin
Result := False;
if Length(Buffer) > 0 then
repeat
if Length(Buffer) > 0 then
if Buffer[1] <> "<" then
Delete(Buffer, 1, 1);
until (Buffer[1] = "<") or (Length(Buffer) <= 1);
if Length(Buffer) < 3 then
exit; - Компилятор говорит, что ошибки тут
i := 1;
bf := "";
repeat
if Length(Buffer) >= i then
begin
inc(i);
if Buffer[i] <> ">" then
bf := bf + Buffer[i];
end;
until (Buffer[i] = ">") or (Length(Buffer) <= 1);
if StrToInt(bf) + i > Length(Buffer) then
exit ------------ и тут
else
begin
Delete(Buffer, 1, i);
UserString := Copy(Buffer, 1, StrToInt(bf));
Result := True;
Delete(Buffer, 1, StrToInt(bf));
end;
end;
----------------------------------------------------------------------------------------------------------------------------------

3. И наконец то, зачем собственно и нужна прога - обмен голосом - синхронный с норм качеством. Возможно ли такое сделать на Delphi, если да, то подкажите как.

Ну вроде пока всё )

P.S. Не судите строго - все когда-то учатся.


 
Сергей М. ©   (2006-06-08 11:42) [1]

Начни с отработки логики коннекта.

Успешная попытка коннекта завершается возбуждением на стороне клиента события OnConnect, на стороне сервера - соответственно OnClientConnect.

Неуспешная попытка завершается возбуждением на стороне клиента события OnError, при этом параметр ErrorCode несет детальную информацию о причинах отказа - код ошибки.


 
medved_68 ©   (2006-06-08 12:54) [2]

А по моему лучше блокирующий вариант Тогда основной проге остается только брать звуковой поток и кусками запихивать в буфер откуда поток обработки сокета их будет отсылать в сетку. При этом все обработки ошибок передачи и коннекта можно возложить на поток. Но для runTime может потребуется двойная буферизация.


 
Сергей М. ©   (2006-06-08 12:59) [3]


> medved_68 ©   (08.06.06 12:54) [2]


> лучше блокирующий вариант


С т.з. конечной цели абсолютно фиолетово, будет гнездо блокирующим или неблокирующим.


 
medved_68 ©   (2006-06-08 15:10) [4]


> С т.з. конечной цели абсолютно фиолетово, будет гнездо блокирующим

В основном потоке обрабатывать передачу на сокет да еще голосовой поток в runtime??? Да еще при нескольких клиентах(конференция)??? Это уже не фиолетово и даже не радужно Да еще при этом заботиться о пользователе, что он там нажимает при чем желательно без промедления, мы же ждать не любим


 
Сергей М. ©   (2006-06-08 15:16) [5]


> medved_68 ©   (08.06.06 15:10) [4]


При чем здесь потоки ? Речь ты завел о режимах работы гнезда, а не о потоках.


 
Сергей М. ©   (2006-06-08 15:17) [6]


> medved_68 ©   (08.06.06 15:10) [4]


Разгреби в голове кашу из режимов и потоков - оно зело полезно будет.


 
medved_68 ©   (2006-06-08 16:58) [7]


> Разгреби в голове кашу из режимов и потоков - оно зело полезно
> будет.

Обижаться оно иногда полезно, но по мне большая разница кто обрабатывает события сокета: центральная программа или дополнительный поток в этом мне кажется и есть основная разница как там говоришь

> Речь ты завел о режимах работы гнезда

и при чем здесь каша???
Кстати в догонку есть один вопрос в принципе если интересно можешь черкнуть на мыло прицеплю пост а вопрос такой:
1. Есть ServerSocket в режиме ctThreadBlocking;
2. Есть ClientSocket в режиме ctBlocking;
3. Сами потоки работы с сокетом реализованы пока TThread;
Так вот проблема:
При подключении клиента сервер начинает ему валить инфу в ввиде блоков, я для пробы сделал картинки но не в этом суть.
Инфа валится пока клиент держит коннект, как только коннект рушится со стороны клиента сервер хоронит поток обслуживающий это соединение.
Все работает но стоит вклинится еще одному клиенту все встало и стоит до тех пор пока не останется только один неважно какой клиент Как только убираю лишних так все опять работает. Эксперементы с критическими секциями и блокировками сокета результата не дали. А далее самое интересное:
Попробовал перейти на TServerClientThread взамен TThread тоже все качает нормально но ПРИ ДИСКОННЕКТЕ СО СТОРОНЫ КЛИЕНТА со стороны сервера глухой Access violant раз несколько и прогу не выпихнешь из памяти разве только диспетчером. Причем поковырял исходник TServerClientThread и не нашел там ничего криминального что нужно либо разрушать либо оставлять вроде все за собой сам убирает.
В принципе то что я описал можно легко конвертировать автору этой темы в принципе какая разница картинки кидать или звук выбирай частоту дискретизации поменьше и нехай.
Вообщем жду ответа конкретно от тебя Обидчивый :)


 
Whitevova ©   (2006-06-08 17:14) [8]

Вообщем с коннектом я разобрался. Файрволл - плохая штука. Это он не пускал пакеты клиента с других компов ко мне. Теперь всё норм. В коде - всё правильно, что компилятору не нравиться не понимаю. Помогите, мож кто с подобным сталкивался уже. А как передать голос - никто конретного примера так и не дал. А хотелось бы. Так что если кто знает как передать, то напишите на мыло, очень надо.


 
medved_68 ©   (2006-06-08 17:28) [9]

Если Сергей М подскажет решение проблемы многопоточности то у тебя и с голосом проблем не будет в принципе о чем я писал выше на видео в реальном времени работает очень даже ничего кидаю в сетку кадры с интервалом 100 миллисекунд и это по видимому не предел


 
Сергей М. ©   (2006-06-09 08:33) [10]


> medved_68 ©   (08.06.06 16:58) [7]


> при чем здесь каша?


Притом что выбор того или иного режима работы гнезда никак не связан с потоками.

Ничто не мешает использовать гнездо в неблок.режиме в любом потоке - хоть основном хоть дополнительном.


> ПРИ ДИСКОННЕКТЕ СО СТОРОНЫ КЛИЕНТА со стороны сервера глухой
> Access violant раз несколько и прогу не выпихнешь из памяти


У тебя ошибка в программе.


 
Сергей М. ©   (2006-06-09 08:37) [11]


> Whitevova ©   (08.06.06 17:14) [8]



> что компилятору не нравиться не понимаю


Ну он же сообщает тебе, что конкретно ему не нравится)


> как передать голос


Точно так же как и любую иную информацию - байт за байтом.

В чем собственно проблема ?


 
Whitevova ©   (2006-06-09 12:36) [12]


> Ну он же сообщает тебе, что конкретно ему не нравится)


Он пишет: Staterment expected, but expression of type "TButton" found


> Точно так же как и любую иную информацию - байт за байтом.
>
>
> В чем собственно проблема ?


Проблема...незнаю как передать. Если можешь, то напиши код примерно такой работы: у людей есть программы-клиенты и микрофоны, они говорят в них и их слышат те, кто указан в определенном списке (Список IP- адресов друзей). Так вот - а как считать голос, как его дальше - без задержки посылать (что бы всё было синхронно). Помоги - или напиши какой-нибудь общий код с комментариями.


 
Сергей М. ©   (2006-06-09 13:30) [13]


> пишет: Staterment expected, but expression of type "TButton"
> found


И что, прямо на строчку с Exit показывает при этом ?
Не верю !
В этом коде никаких TButton нет и в помине ..

Если же таки предположить, что компилятор ошибается, то поудаляй в директории проекта все dcu и пересобери проект.


> а как считать голос


Этот вопрос не по Сетям, его следует задавать, например, в Мультимедиа.

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=1&txtCodeId=62012
http://forum.sources.ru/index.php?showtopic=141310


 
Whitevova ©   (2006-06-09 20:01) [14]


> И что, прямо на строчку с Exit показывает при этом ?
> Не верю !
> В этом коде никаких TButton нет и в помине ..
>
> Если же таки предположить, что компилятор ошибается, то
> поудаляй в директории проекта все dcu и пересобери проект.
>


Точно, извиняюсь за ошибку - показывает не на exit, а на else после exit в обоих местах.


> Сергей М.
>
> Этот вопрос не по Сетям, его следует задавать, например,
>  в Мультимедиа.
>
> http://www.planet-source-code.com/vb/scripts/ShowCode.asp?
> lngWId=1&txtCodeId=62012
> http://forum.sources.ru/index.php?showtopic=141310


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


 
Whitevova ©   (2006-06-09 20:21) [15]


> Точно, извиняюсь за ошибку - показывает не на exit, а на
> else после exit в обоих местах.


А вообше,чтоб без путанницы - вот:

function TForm1.GetUserStringFromBuffer(var UserString: string): Boolean;
var
 i: Integer;
 bf: string;
begin
 result := False;
 if Length(Buffer) > 0 then
   repeat
     if Length(Buffer) > 0 then
       if Buffer[1] <> "<" then
         Delete(Buffer, 1, 1);
   until (Buffer[1] = "<") or (Length(Buffer) <= 1);
 if Length(Buffer) < 3 then
   exit; --------------------------------------------------------------- ошибка тут

 i := 1;
 bf := "";
 repeat
   if Length(Buffer) >= i then
   begin
     inc(i);
     if Buffer[i] <> ">" then
       bf := bf + Buffer[i];
   end;
 until (Buffer[i] = ">") or (Length(Buffer) <= 1);
 if StrToInt(bf) + i > Length(Buffer) then
   exit
 else --------------------------------------------------------- и тут
   Delete(Buffer, 1, i);
   UserString := Copy(Buffer, 1, StrToInt(bf));
   Result := true;
   Delete(Buffer, 1, StrToInt(bf));
end;


 
medved_68 ©   (2006-06-10 17:41) [16]


> begin
>  result := False;
>  if Length(Buffer) > 0 then
>    repeat
>      if Length(Buffer) > 0 then
>        if Buffer[1] <> "<" then
>          Delete(Buffer, 1, 1);
>    until (Buffer[1] = "<") or (Length(Buffer) <= 1);
>  if Length(Buffer) < 3 then
>    exit; -----------------------------------------------
> ---------------- ошибка тут

Мне кажется что надо сделать здесь так:

> begin
>  result := False;
>  if Length(Buffer) > 0 then
Begin
>    repeat
>      if Length(Buffer) > 0 then
>        if Buffer[1] <> "<" then
>          Delete(Buffer, 1, 1);
>    until (Buffer[1] = "<") or (Length(Buffer) <= 1);
end;
>  if Length(Buffer) < 3 then
>    exit; -----------------------------------------------
> ---------------- ошибка тут


А во втором случае мне кажется конечный END он у тебя закрывает функцию
но по логике построения должен закрывать ELSE, если конечно по алгоритму у тебя не один оператор DELETE в  ветке ELSE.


>  if StrToInt(bf) + i > Length(Buffer) then
>    exit
>  else --------------------------------------------------
begin
> ------- и тут
>    Delete(Buffer, 1, i);
>    UserString := Copy(Buffer, 1, StrToInt(bf));
>    Result := true;
>    Delete(Buffer, 1, StrToInt(bf));
> end;


 
Whitevova ©   (2006-06-11 10:45) [17]

Что-то не помогло.


 
Whitevova ©   (2006-06-12 14:46) [18]

Эх мастера. Неужели всё так плохо?


 
Сергей М. ©   (2006-06-13 09:10) [19]


> Неужели всё так плохо?


Хуже не придумаешь.


> в DW много решений - выбрал наиболее удобное


Чем же оно "удобное" ? Тем более если "не работает" ?
Да и "удобством" ли следует руководствоваться в такого рода приложениях ?
Не удобством, а , в 1-ю очередь, эффективностью, производительностью !
А о производительности этого алгоритма не может идти и речи из-за бестолковых манипуляций с длинными строками.


 
medved_68 ©   (2006-06-13 17:41) [20]

WhiteVova Кидани проект на мыло разберемся в чем бодяга Если конечно актуально!!! С голосом еще ничего не придумал???? А то поделись соображениями если не жалко


 
Whitevova ©   (2006-06-13 19:34) [21]

Да - класс... я тока удалил то, о чем спрашивал и стал писать по новой - по другому и появились новые ошибки. Но если реально можешь помочь - то кину - тот, о котором тут речь идет. Ок?


 
Whitevova ©   (2006-06-13 19:45) [22]

А вообше - лучше посмотри, что я сечас переделываю. Мне кажется так будет лучше... Писать о том, что и как будет теперь в данной теме бессмысленно. Так что лучше пошлю тебе на e-male (скорее всего завтра после обеда) мой текущий проект. Посморищь - может чем и поможешь и что-нибудь дельное у меня и получиться.

А шас буду делать дальше.


 
sound81 ©   (2006-06-14 09:43) [23]

Слушай, а может не стоит самому писать а (раз для тебя так много непонятного),
таких прог ведь кучи, которые говорилки по сети. Например юзал я как то NetSpeaker, в ней и чат и передача файлов и голоса есть. Не помню где брал, сам  думаю найдешь


 
medved_68 ©   (2006-06-14 10:50) [24]


> Так что лучше пошлю тебе на e-male (скорее всего завтра
> после обеда) мой текущий проект.

ОКЕЙ


 
Whitevova ©   (2006-06-14 18:45) [25]


> Слушай, а может не стоит самому писать а (раз для тебя так
> много непонятного),
> таких прог ведь кучи, которые говорилки по сети. Например
> юзал я как то NetSpeaker, в ней и чат и передача файлов
> и голоса есть. Не помню где брал, сам  думаю найдешь


... непонятного не много. Просто есть вопросы, на которые... =)
... А если я пишу программу, значит она мне нужна. ВА то чтро существует много подобных аналогов - я прекрасно знаю. Но они мне не нужны. Почему - объяснять думаю не надо.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.04 c
15-1161074442
ZeroDivide
2006-10-17 12:40
2006.11.05
Мне стыдно за мой универ :(


15-1161034403
SerJaNT
2006-10-17 01:33
2006.11.05
Распознавание текста


1-1159008685
DelphiLamer
2006-09-23 14:51
2006.11.05
Как получить список всех процедур в библиотеке?


1-1159007734
Дмитрий В
2006-09-23 14:35
2006.11.05
Как записать байт в lpt порт


6-1150219083
Интересующийся
2006-06-13 21:18
2006.11.05
Как определьть IP указывающий основной шлюз?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский