![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TIdCmdTCPServer
Zalm © (2009-08-31 13:14:00)Здравствуйте, как у TIdCmdTCPServer можно всем клиентам разослать сообщение? Надо например каждому отослать команду. Это должно быть естественно в цикле, только я не знаю как и где. У TServerSocket было проще всё, ну или понятней.
1)Вот например у меня есть кнопка на сервере, как сделать чтоб ы при нажатии на кнопку каждому подключению что-то отправить, и что бы узнать его адрес там и тд?
2) Как узнать ip и handler подключения? и в каком евенте... если в OnConnect то я не опнля как...
3) Как вне событий отправить текст на подключение с известным адресом\обработчкиом?
Буду очень благодарен за помощь.
Сергей М. (2009-09-07 13:23:00) [101]
> вопросы задаете, которые ни на что не наводят меня
Это печально. Очень.
Сергей М. (2009-09-07 13:21:00) [102]
> у меня нету. есть только Server.Contexts
Да ну какая разница ?
пусть будет не Connections, а Contexts - суть свойства от этого не меняется.
> LockList в котором уже я ничего не нашел
Что и где ты искал из того что не нашел ?
Сергей М. (2009-09-07 13:13:00) [103]
> Зачем вам всё время нужен этот протокол я никак не понимаю
Для того чтобы понять "язык", на котором ты пытаешься заствить разговаривать своих клиентов со своим сервером - что, кому, когда, в каком формате и при каких условиях передается/принимается
Пойми, наконец, что без формализованного прикладного протокола инф.обмена ничего путного у тебя не получится. Любую сколь-либо серьезную сетевую разработку следует начинать с листа бумаги и авторучки, а не со слепого тыканья в компонентах.
> у меня проблема совсем в другом
Не надо себе их, проблемы эти, создавать, тогда и не придется их потом героически преодолевать.
Взять хотя бы элементарное, о чем я у тебя уже спросил в [45] ..
Zalm (2009-09-07 12:57:00) [104]
> если у тебя есть список уникальных объектов IdTCP.Server.
> Connections
У вас может быть и есть, а у меня нету. есть только Server.Contexts в котором есть LockList в котором уже я ничего не нашел.
Вот просил же хоть что-то показать конкретное, а вы мне только наводящие вопросы задаете, которые ни на что не наводят меня(
Zalm (2009-09-07 12:52:00) [105]да что есть? ничего там нет, просил же показать то о чем вы всё время говорите, так вы не можете.
Зачем вам всё время нужен этот протокол я никак не понимаю, у меня проблема совсем в другом.
Сергей М. (2009-09-07 10:13:00) [106]За каким тебе понадобились хендлы, если у тебя есть список уникальныхобъектов IdTCP.Server.Connections, каждый из которых отражает контекст соединения сервера с одним из его активных клиентов ?
Сергей М. (2009-09-07 09:01:00) [107]Тихий ужас..
Хендлы какие-то куда-то отправляются ..
Ты в состоянии изложить формальное описание разработанного тобой протокола инф.обмена между клиентами и сервером ?
Zalm (2009-09-06 21:13:00) [108]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, Buttons,
idContext;
type
TForm1 = class(TForm)
Server: TIdTCPServer;
procedure ServerConnect(AContext: TIdContext);
procedure ServerExecute(AContext: TIdContext);
private
{ Private declarations }
public
{ Public declarations }
end;
_Pack = Record
Primary_handle : Cardinal;
Secondary_handle : Cardinal;
Primary_index : string[8];
Secondary_index : string[8];
End;
{функция для того что бы составить пару из подключений}
Function Connect_to_Clients( Handle : cardinal; index : string):boolean;
{получение хэндла "соседа" пары, отправили свой handle, в ответе получили его handle}
Function GetHandleByHandle(Handle : cardinal):Cardinal;
{ "переброс" команд, отправляем свой handle, и что хотели отправить "соседу"}
Procedure Transfer(handle : cardinal; str: string);
var
Form1: TForm1;
Pack : _Pack;
Clients : Array of _Pack;
Clients_count : integer;
implementation
{$R *.dfm}
procedure TForm1.ServerConnect(AContext: TIdContext);
var
str : string;
begin
AContext.Connection.Socket.WriteLn('Welcame'+#13+'Index[8]: ');
Str:=AContext.Connection.Socket.ReadLn();
if length(str)<>8 then
begin
AContext.Connection.Socket.WriteLn('Error length index');
AContext.Connection.Disconnect;
end
else
begin
if Connect_to_clients(Acontext.Connection.Socket.Binding.Handle,str) then
begin
Acontext.Connection.Socket.WriteLn('Start transfer');
end
else
begin
Acontext.Connection.Socket.WriteLn('Error registration');
AContext.Connection.Disconnect;
end;
end;
end;
Function Connect_to_Clients( Handle : cardinal; index : string):boolean;
var
i : integer;
register_ : boolean;
begin
Result:=false;
for i:=0 to Clients_count-1 do
begin
if ((Clients[i].Primary_index=index)or(Clients[i].Secondary_index=index)) then
begin
if Clients[i].Primary_index=index then
begin
Clients[i].Secondary_handle:=Handle;
Clients[i].Secondary_index:=index;
result:=true;
exit;
end;
if Clients[i].Secondary_index=index then
begin
Clients[i].Primary_handle:=Handle;
Clients[i].Primary_index:=index;
result:=True;
exit;
end;
end;
end;
inc(clients_count);
SetLEngth(Clients,Clients_count);
Clients[Clients_count-1].Primary_handle:=handle;
Clients[Clients_count-1].Primary_index:=Index;
Result:=True;
end;
procedure TForm1.ServerExecute(AContext: TIdContext);
var
msg : string;
i : integer;
begin
msg:=AContext.Connection.Socket.ReadLn();
if msg='\handle\' then
begin
AContext.Connection.Socket.WriteLn(IntTOStr(AContext.Connection.Socket.Binding.H andle));
exit;
end;
if msg='\clients\' then
begin
for i:=0 to CLients_count-1 do
begin
AContext.Connection.Socket.WriteLn(
'-----------------'+#13+'Couple '+IntToStr(i+1)+#13+
'PH: '+IntToStr(Clients[i].Primary_handle)+#13+
'PI: '+Clients[i].Primary_index+#13+
'SH: '+IntToStr(Clients[i].Secondary_handle)+#13+
'SI: '+Clients[i].Secondary_index);
end;
AContext.Connection.Socket.WriteLn('Done. '+IntToStr(Clients_count)+' couples.');
exit;
end;
if msg='\couples\' then
begin
AContext.Connection.Socket.WriteLn(INtToStr(Clients_count)+' couples.');
exit;
end;
if msg='\GetHandleByHandle\' then
begin
AContext.Connection.Socket.WriteLn(IntToStr(GetHandleByHandle(AContext.Connectio n.Socket.Binding.Handle)));
end;
Transfer(AContext.Connection.Socket.Binding.Handle,msg);
end;
Procedure Transfer(handle : cardinal; str: string);
var
_handle : cardinal;
begin
_handle:=GetHandleByHandle(handle);
{...по идее тут отправка str подключению с известным нам _handle,
это и есть товарищ из пары, вот только как отправить таким спобом
этого я не знаю..:( }
end;
Function GetHandleByHandle(Handle : cardinal):Cardinal;
var
i : integer;
begin
result:=0;
for i:=0 to Clients_count-1 do
begin
if Clients[i].Primary_handle=handle then
begin
result:=Clients[i].Secondary_handle;
exit;
end;
if Clients[i].Secondary_handle=handle then
begin
Result:=Clients[i].Primary_handle;
exit;
end;
end;
end;
end.
вот, вроде как бы всё работает, но до определенного затыка в процедуре Transfer.
Сергей М. (2009-09-06 16:51:00) [109]
> отправить через TidTCPServer, забыл уточнить
Хоть через луну !
Ход своеймысли продемонстрируй ..
Сергей М. (2009-09-06 16:50:00) [110]
> у меня не получается
Показывай что делал ..
С подробнымикомментариями движений своеймысли для каждой строчки своего кода ..
Zalm (2009-09-06 16:47:00) [111]отправить через TidTCPServer, забыл уточнить
Zalm (2009-09-06 05:14:00) [112]ох... вернулся к этой тему.. что-то я никак не пойму:( у меня не получается никак отправить кому-то что-то за пределы его потока.
можете пожалуйста если вам не сложно показать кусок конкретного кода как отправить кому-то что-то не из его потока?
Я был бы очень благодарен
Anatoly Podgoretsky (2009-09-03 09:10:00) [113]
> Ну дык еще и исходники всегда перед носом)
Ну ты и садист.
Сергей М. (2009-09-02 22:18:00) [114]
> Читая протокол
Как можно читать то, что ты еще не написал ?)
> какие команды сначала надо слать с сервера клиенту
А что, клиент нуждается в каких-то командах ?
Нахрена, спрашивается, тогда нужен сервер, если клиенты готовы исполнять его прихоти ?)
> какая последовательность компанд друг другу дожна быть что
> бы они подключились?
Никакая.
Ты же сам утверждаешь, что якобы "подключался с телефона к серверу", при этом ни ты серверу, ни сервер тебе не посылал никаких "команд")
Чудеса ?)
Zalm (2009-09-02 18:52:00) [115]я знаю как всё написать, просто пока не определился точно к компонентом.
Читая протокол я не понял какие команды сначала надо слать с сервера клиенту когда он подключится тока... я подключался с телефона к серверу, он подключается и молчит и чего-то ждет... где можно прочитать коротко какая последовательность компанд друг другу дожна быть что бы они подключились? Подскажете?
Медвежонок Пятачок (2009-09-02 18:35:00) [116]что сложного сделать сервер котоый будет просто текст перебрасывать?
не сложно. сложно написать клиента который понял бы все перебрасываемое ему.
хотя тоже не сложно (если самому себе не рыть ям)
Сергей М. (2009-09-02 17:31:00) [117]
> но только не для обмена с сервером "пересылки", а с конечными
> точками
А "конечные точки" у тебя между собой напрямую не взаимодействуют.
Они же у тебя "разговаривают" через твой сервер-посредник, так что и речь может идти не иначе как о протоколе инф.обмена между клиентами и сервером-посредником.
> TServerSocket мне не нравится так придется все потоки в
> ручную писать
В смысле ?
> Можно Как-то закосить сервер под сервер аси?
Можно.
Zalm (2009-09-02 17:20:00) [118]Я знаю что такое HTTP и как работает...
Если это можно назвать "разработал", то можно и так, но только не для обмена с сервером "пересылки", а с конечными точками.
TServerSocket мне не нравится так придется все потоки в ручную писать и много вобще придется писать.
А на TIdTCPServer думаю проще будет, он и потоки сам создает же, и всё лучше... так что попробую через него.
Еще вопрос такой мб сторонний немного, к этой теме относится только тем что тоже работа с сетью. Можно Как-то закосить сервер под сервер аси? что бы например конектится не к login.icq.com, а например к моему сервру, и что бы он клиенту контакт лист выдал и мог читать что этот клиент отправит на сервер? и не более. Больше ничего серверу не требуется кроме как выдать конаткт лист с заранее вписанными на сервер контактами, и читать что этим контактам будет слать клиент. То есть есть один сервер и один клиент.. ну думаю вы поняли задачу..)
Сергей М. (2009-09-02 09:11:00) [119]
> что сложного сделать сервер котоый будет просто текст перебрасывать?
А нашиша тогда выбрал TId CmdTCPServer, если требуется "просто текст перебрасывать" ? Почекму не TIdTCPServer ? И чем так уж не угодил тот же самый TServerSocket, тем более что там для тебя "проще всё, ну или понятней" ?
> а конкретнее?
Вот сейчас мы с тобой "разговариваем" при использовании протокола информационного обмена HTTP.
А тыразработал свойпротокол ?)
Zalm (2009-09-01 23:13:00) [120]эх.. а конкретнее?
что сложного сделать сервер котоый будет просто текст перебрасывать?
ему же ничего не надо трогать, получил, передал дальше, и всё.
Как я понял уже через TIdCmdTCPServer это не очень удобно делать.