Форум: "Начинающим";
Текущий архив: 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("Ââåäèòå çíà÷åíèå ïîðòà!");
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;
вот код
← →
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("Ïàêåò äàííûõ ïðèíÿò");
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