Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обратная связь TcpServer - TcpClient


Страницы:   1 2

Dddddddd ©   (2007-07-13 14:04:00) 

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


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

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


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

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

Оч даже могу)

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

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

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

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


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

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


medved_68   (2007-07-13 15:25:00) [23]


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

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


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

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


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

Не верю.

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


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


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

Конечно


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

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


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


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


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


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


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

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

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


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


> вот код


Вижу.

И что с ним ?


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

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


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

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('Ââåäèòå çíà÷åíèå ïîðòà!');
       edtRemotePort.SetFocus;
       Exit;
     end
 else
   begin
     ShowMessage('Ââåäèòå IP àäðåñ ñåðâåðà!');
     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('Îøèáêà ïîäêëþ÷åíèÿ ê ñåðâåðó');
 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('Îøèáêà ïîäêëþ÷åíèÿ ê ñåðâåðó');
 ErrorCode := 0;
end;

вот код


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


> Dddddddd   (13.07.07 15:03) [7]


Угу.

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


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

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


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

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


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

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

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.


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


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

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


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

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


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

В 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:13:00) [39]


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


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


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


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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо