Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.12;
Скачать: CL | DM;

Вниз

Обратная связь TcpServer - TcpClient   Найти похожие ветки 

 
Dddddddd   (2007-07-13 14:04) [0]

Подскажите плз как отправить с сервера (TcpServer) message последнему клиенту (TcpClient), в каком обработчике читать message на клиенте? В другую сторону все работае нормально


 
Сергей М. ©   (2007-07-13 14:13) [1]


> как отправить .. message последнему клиенту


Точно так же как первому.


> в каком обработчике читать message на клиенте?


OnReceive, это же очевидно)


 
Dddddddd   (2007-07-13 14:42) [2]

В OnReceve пробовал, туда даже не заходит!!!
Вот код:

procedure TForm1.btnSendClick(Sender: TObject);
begin
 TcpClient1.RemoteHost := edtRemoteHost.Text;
 TcpClient1.RemotePort := edtRemotePort.Text;
 try
   if TCPClient1.Connect then
     TCPClient1.Sendln(edtMessage.Text)
   else
     ShowMessage("Not connected");
 finally
   TcpClient1.Disconnect;
 end;
end;

procedure TForm1.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
var
 s: String;
begin
 s:=ClientSocket.receiveln;
 while s <> "" do begin
   memo1.Lines.add(ClientSocket.RemoteHost+": "+ClientSocket.RemotePort+": "+s);
   s:=ClientSocket.receiveln;
   TcpServer1.Sendln("Данные получены");//Здесь отправка сообщ клиенту
 end;
 TCPClient1.Disconnect;
end;

procedure TForm1.btnServerStartClick(Sender: TObject);
begin
 TCPServer1.LocalHost := edtServerHost.Text;
 TCPServer1.LocalPort := edtServerPort.Text;
 TCPServer1.Active := True;

 btnServerStop.Enabled := True;
 btnServerStart.Enabled := False;
end;

procedure TForm1.btnServerStopClick(Sender: TObject);
begin
 TcpServer1.Active := False;

 btnServerStop.Enabled := False;
 btnServerStart.Enabled := True;
end;

procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;
 var DataLen: Integer);
begin
 memo1.Lines.add(Buf);
end;

В чем тут дело???


 
Сергей М. ©   (2007-07-13 14:45) [3]

А какого черта ты читаешь сообщение от клиента в OnAccept, если у тебя перед носом событие OnReceive, говорящее само за себя о своем предназначении ?


 
Dddddddd   (2007-07-13 14:48) [4]

У TcpServer такого события нету!!!!!!!!!!


 
Сергей М. ©   (2007-07-13 14:52) [5]

А это (цитата из справки)

Derived from TCustomTcpServer

OnAccept
  OnGetThread
  OnListening

Derived from TBaseSocket

OnCreateHandle
  OnDestroyHandle
  OnError
  OnReceive
  OnSend

Occurs after a socket receives data, but before it passes the data to the application.

Delphi syntax:

property OnReceive: TSocketDataEvent;

C++ syntax:

__property TSocketDataEvent OnReceive = {read=FOnReceive, write=FOnReceive};

Description

Write an OnReceive event handler to read from the socket connection. Use the OnReceive event to filter data before passing it back to the client application.


я сам, по-твоему, выдумал ?


 
Сергей М. ©   (2007-07-13 14:58) [6]

Тебе чем TServerSocket + TClientSocket не угодили ?)


 
Dddddddd   (2007-07-13 15:03) [7]

Не знаю, с ними пробовал, когда на своем компе тестишь, все нормально работает, а когда сервер на другом запускаешь, коннект есть, а сообщ. не доходят.


 
Сергей М. ©   (2007-07-13 15:04) [8]


> Dddddddd   (13.07.07 15:03) [7]


Угу.

Те компоненты, знач, "глючные" оказались, а у этих прямо на лбу написано, что они "не глючные", поэтому ты к ним и метнулся) ... Так что ли ?)


 
Dddddddd   (2007-07-13 15:08) [9]

procedure TForm1.btnSendClick(Sender: TObject);
begin
 if ClientSocket1.Active then
   ClientSocket1.Active := False;
 if Length(edtRemoteHost.Text)>0 then
   if Length(edtRemotePort.Text)>0 then
     begin
       ClientSocket1.Address := edtRemoteHost.Text;
       ClientSocket1.Port := StrToInt(edtRemotePort.Text);
       ClientSocket1.Active := True;
       Application.ProcessMessages;
     end
   else
     begin
       ShowMessage("&#194;&#226;&#229;&#228;&#232;&#242;&#229; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229; &#239;&#238;&#240;&#242;&#224;!");
       edtRemotePort.SetFocus;
       Exit;
     end
 else
   begin
     ShowMessage("&#194;&#226;&#229;&#228;&#232;&#242;&#229; IP &#224;&#228;&#240;&#229;&#241; &#241;&#229;&#240;&#226;&#229;&#240;&#224;!");
     edtRemoteHost.SetFocus;
     Exit;
   end;
 try
   if ClientSocket1.Active then
     ClientSocket1.Socket.SendText(edtMessage.Text);
 finally
//    ClientSocket1.Active := False;
 end;
end;

procedure TForm1.btnServerStartClick(Sender: TObject);
begin
 ServerSocket1.Port := StrToInt(edtServerPort.Text);
 ClientSocket1.Active := False;
 ServerSocket1.Active := True;

 btnServerStop.Enabled := True;
 btnServerStart.Enabled := False;
end;

procedure TForm1.btnServerStopClick(Sender: TObject);
begin
 if ServerSocket1.Active then
   ServerSocket1.Active := False;

 btnServerStop.Enabled := False;
 btnServerStart.Enabled := True;
end;

procedure TForm1.SendMesAll(Text: String);
var
 i: byte;
begin
 with ServerSocket1.Socket do
   begin
     if ActiveConnections > 0 then
       for i := 0 to ActiveConnections - 1 do
         try
           Connections[i].SendText(Text);
           Application.ProcessMessages;
         except
           //
         end;
 end; {/WITH}
end;

procedure TForm1.SendMesLast(Text: String);
var
 i: byte;
begin
 with ServerSocket1.Socket do
   begin
     if ActiveConnections > 0 then
       try
         i := ActiveConnections - 1;
         Connections[i].SendText(Text);
         Application.ProcessMessages;
       except
         //
       end;
 end; {/WITH}
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
 s: String;
begin
 s := Socket.ReceiveText;
 Memo1.Lines.Add(Socket.RemoteAddress+": "+Socket.RemoteHost+": "+s);
 SendMesLast("Получено");
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
 ShowMessage("&#206;&#248;&#232;&#225;&#234;&#224; &#239;&#238;&#228;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255; &#234; &#241;&#229;&#240;&#226;&#229;&#240;&#243;");
 ErrorCode := 0;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
 s: String;
begin
 s := Socket.ReceiveText;
 Memo1.Lines.Add(s);
end;

procedure TForm1.ServerSocket1ClientError(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
 ShowMessage("&#206;&#248;&#232;&#225;&#234;&#224; &#239;&#238;&#228;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255; &#234; &#241;&#229;&#240;&#226;&#229;&#240;&#243;");
 ErrorCode := 0;
end;

вот код


 
Dddddddd   (2007-07-13 15:10) [10]

Причем тут компоненты, че не правильно то?


 
Сергей М. ©   (2007-07-13 15:10) [11]


> вот код


Вижу.

И что с ним ?


 
Сергей М. ©   (2007-07-13 15:12) [12]


> Причем тут компоненты


Вот и я говорю - причем тут они, если ты между ними мечешься ?)


> че не правильно то?


да много чего)

Сам-то как думаешь ?

Ты код трассировал ?


 
Dddddddd   (2007-07-13 15:13) [13]

Когда у себя на компе клиента и сервер запускаю, все доходит, (и туда и обратно), а когда на разных то не проходят messages


 
Dddddddd   (2007-07-13 15:15) [14]


> Ты код трассировал ?

Конечно


 
Сергей М. ©   (2007-07-13 15:19) [15]

Не верю.

И не верю именно для случая, когда твой клиент и сервер разнесены по разным хостам.


 
Dddddddd   (2007-07-13 15:21) [16]

Ты толком то че нить подсказать можешь, а то верю - не верю


 
medved_68 ©   (2007-07-13 15:25) [17]


> Ты толком то че нить подсказать можешь, а то верю - не верю

Dddddddd  так тебе подсказывают - трассируй код на приемной стороне, разнеся программы по разным компам.:)))


 
Сергей М. ©   (2007-07-13 15:28) [18]

Ну почему не могу ?

Оч даже могу)

Только вот тут не подсказкой пахнет, а радикальной переделкой кода сервера и клиента.

Эт чего вообще такое, чат что ли ?

Хорошо, вот тебе образчик самой первой ошибки, что бросается в глаза:

  if ClientSocket1.Active then
    ClientSocket1.Socket.SendText(edtMessage.Text);


А если ClientSocket1.Active = False, то, соотв-но, до SendText() дела не дойдет.

И после этого ты продолжишь утверждать, что ты сообщение отправил, а оно почему-то не дошло ?)


 
Dddddddd   (2007-07-13 15:34) [19]

Нет, это не чат, надо исходные данные передать на сервер, чтобы там задача считалась, а я с сокетами не работал до этого, вот и тренируюсь


 
Сергей М. ©   (2007-07-13 15:35) [20]

Ну вот и есть повод потренироваться)

Инфу для размышления ты в [18] получил)


 
Dddddddd   (2007-07-13 16:08) [21]

не заходит он вообще сюда при отправке с другого компа
IP шник ввожу правильно, да и порт одинаковый, Server активен

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
 s: String;
begin
 s := Socket.ReceiveText;
 Memo1.Lines.Add(Socket.RemoteAddress+": "+Socket.RemoteHost+": "+s);
 SendMesLast("&#207;&#224;&#234;&#229;&#242; &#228;&#224;&#237;&#237;&#251;&#245; &#239;&#240;&#232;&#237;&#255;&#242;");
end;


 
Dddddddd   (2007-07-13 16:09) [22]

if ClientSocket1.Active then я убрал


 
Сергей М. ©   (2007-07-13 16:10) [23]


> не заходит он вообще сюда


Я ему про фому, а он мне все про ерему гнет)

Ты вник в то что я тебе в [18] сказал ?


 
Сергей М. ©   (2007-07-13 16:14) [24]


> if ClientSocket1.Active then я убрал


Нахрена ?)

Так и будешь туда-сюда метаться - "убрал", "добавил" ?

Думать-то собираешься ?)

Как ты собираешься отправить что-то там своему серверу, если ClientSocket1.Active = False ?

"Нет строчки - нет и проблемы"  - это ж страусиный метод)


 
Dddddddd   (2007-07-13 16:18) [25]


> Ты вник в то что я тебе в [18] сказал ?

см. выше, условие убрал!!!!!!!!!!!!!
SendText отрабатывает!!!!!!!!!
ClientSocket1.Active true


 
lamerskii_vopros   (2007-07-13 16:23) [26]


>  if ClientSocket1.Active then     ClientSocket1.Socket.SendText(edtMessage.
> Text);

пиши SendText в событии OnConnect... вот, не удержался...


 
Сергей М. ©   (2007-07-13 16:25) [27]


> ClientSocket1.Active true


Откуда ты знаешь ?


> SendText отрабатывает


Если отрабатывает и при этом не происходит исключения и не возникает события OnError, то событие OnClientRead на сервере рано или поздно обязано возникнуть, если конечно же файрволы на пути между сервером и клиентом этому не препятствуют.

И вообще - где обработка OnConnect, OnWrite ?

Отправлять что-то там партнеру по соединению следует НЕ ранее возникновения ближайшего по времени события OnWrite. Именно это событие фиксирует факт готовности соединения к передаче данных.


 
Dddddddd   (2007-07-13 16:34) [28]


> пиши SendText в событии OnConnect... вот, не удержался..
> .

пасибки заработало


 
Сергей М. ©   (2007-07-13 16:50) [29]


> пасибки заработало


Ну дык а что ж ты трындел про "SendText отрабатывает!!!!!!!!! " ?)
Да еще и с кучей восклицаний ?)

Нагло врал ?)


 
Dddddddd   (2007-07-13 16:57) [30]


> Ну дык а что ж ты трындел про "SendText отрабатывает!!!!
> !!!!! " ?)
> Да еще и с кучей восклицаний ?)


Оператор SendText выполнялся, просто он у меня выполнялся по батону а надо было его в OnConnect отрабатывать, меня еще удивило то что при трассировке в старом варианте все доходило, а без нее нет.


 
Dddddddd   (2007-07-13 17:00) [31]

2 Сергей М.:
Все равно спасибо


 
Сергей М. ©   (2007-07-13 17:00) [32]


> просто он у меня выполнялся по батону


Ну дык а я тебе про Acnive зря что ль трындел, чудо ты в перьях ?)


 
Сергей М. ©   (2007-07-13 17:01) [33]


> меня еще удивило


А меня другое удивило - от балды вставленная в код клиента строчка

Application.ProcessMessages


 
Сергей М. ©   (2007-07-13 17:03) [34]

Ничерта ты не понял)
Тебе ни тот ни этот комплект компонентов не поможет.
Сожалею.


 
Dddddddd   (2007-07-13 17:07) [35]

2 Сергей М:
У меня уж все давно работает


 
Сергей М. ©   (2007-07-13 17:09) [36]


> У меня уж все давно работает


Рано или поздно перестанет.

Почему ?

тебя оно не волнует, судя по эйфории)


 
Dddddddd   (2007-07-13 17:17) [37]


> Рано или поздно перестанет.
>
> Почему ?
>
> тебя оно не волнует, судя по эйфории)

не какой эйфории нет
а по поводу Application.ProcessMessages, перед ней был другой оператор SendText, просто забыл удалить, кстати это советовали на форуме такие же "великие мастера", как и ты)))


 
Сергей М. ©   (2007-07-13 17:20) [38]


> Dddddddd   (13.07.07 17:17) [37]


Тебе, клоуну, был всего лишь намек на необходимость внимательного изучения исходников этих компонентов, благо они у тебя перед носом)

Ну да флаг тебе в руки)


 
Dddddddd   (2007-07-13 17:26) [39]

>Сергей М. следил бы за базаром, барбос



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

Текущий архив: 2007.08.12;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.036 c
15-1184255892
Petr V. Abramov
2007-07-12 19:58
2007.08.12
А почему в Маскве


11-1150264932
MZUser
2006-06-14 10:02
2007.08.12
Создание DLL


2-1184854845
Avokain
2007-07-19 18:20
2007.08.12
Числа вида 1,000,000


2-1184308818
Kolan
2007-07-13 10:40
2007.08.12
Почему один пакет не видит, что в другом пакете есть класс?


15-1184009465
Petr V. Abramov
2007-07-09 23:31
2007.08.12
задача по физике :)