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

Вниз

Обратная связь 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.043 c
2-1184731192
Jann
2007-07-18 07:59
2007.08.12
работа с файлом dbf


15-1184418835
Anatoly Podgoretsky
2007-07-14 17:13
2007.08.12
Московский потоп


6-1167880831
LFRT
2007-01-04 06:20
2007.08.12
Как с помощью сокетов получить от сервера имя файла


2-1184297161
Riply
2007-07-13 07:26
2007.08.12
Объявление структур по-русски :)


2-1183456368
azamatufa
2007-07-03 13:52
2007.08.12
ADO, Ehlib. Коллеги, подскажите, пожалуйста!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский