![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обратная связь TcpServer - TcpClient
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, это же очевидно)