-
Здравствуйте!, я использую пару клиент-сервер для реализации чего то вроди чата с расширенныли функциями
Вот часть кода:
......
procedure TMyChat.SendCommand(s:string);
begin
TcpClient1.Active := True;
try
if TcpClient1.Connect then
begin
TcpClient1.Sendln(s);
Edit.Clear;
end;
finally
TcpClient1.Disconnect;
end;
end;
.............
procedure TMyChat.Button1Click(Sender: TObject);
var
c : boolean;
begin
Display.Lines.Add(Edit.Text);
........
if UpperCase(Edit.Text) ='DIR' then
Begin
SendCommand('Command : DIR');
c:=true;
end;
..........
procedure TMyChat.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
.......
begin
try
CurrentCommand:=ClientSocket.Receiveln;
Display.Lines.Add('Server : '+CurrentCommand);
.........
if CurrentCommand='Command : DIR' then
begin
GetDir(0,CurrentDir);
SEndCommand('Директория : '+CurrentDir);
SEndCommand('-------------------------------------');
if FindFirst(CurrentDir + '\*.*', faAnyFile, tt) = 0 then
begin
repeat
if tt.Attr = faDirectory then
SendCommand('[DIR]'+tt.Name)else
SendCommand(tt.Name+' [Size : '+inttostr(tt.SIZE)+']');
until FindNext(tt) <> 0;
FindClose(tt);
end;
SEndCommand('Конец-------------------------------');
end;
......
except
on E:Exception do
begin
if ClientSocket.Connected then
ClientSocket.Sendln('-ERR Raised exception with message: '+E.Message)
else
raise;
end;
end;
CurrentCommand:='';
end;
а получается иногда нормально, но чаще байда на пример такая:
dir
Server : Директория : C:\Documents and Settings\Felix\Рабочий стол\EXT_New !!!_My_Chat_TcpServer&TcpClient
Server : My_Chat.dpr [Size : 238]
Server : [DIR]..
Server : [DIR].
Server : -------------------------------------
Server : My_Chat.dproj [Size : 3054]
Server : My_Chat.dproj.local [Size : 1850]
Server : My_Chat.exe [Size : 494080]
Server : My_Chat.identcache [Size : 199]
Server : My_Chat.res [Size : 5280]
Server : My_Chat_.dcu [Size : 19486]
Server : My_Chat_.dfm [Size : 2279]
Server : My_Chat_.pas [Size : 8260]
Server : Конец-------------------------------
-
ну, не делай «байды».
собственно — а что не так? (помимо неверной работы с FindXXX)
---
Understanding is not required. Only obedience.
-
2 ketmar
Сообщения выводятся не в том порядке, в котором я их отправляю...
А что не так с FindXXX?
-
>[2] Andrewtitoff © (2008-02-14 22:44:00)
порядок даже не пытался ачмоиовать.
п с финдом… хэдп читал? я вижу, что нет.
---
Understanding is not required. Only obedience.
-
тьфу!
---
Understanding is not required. Only obedience.
-
Andrewtitoff © (14.02.08 22:31)
SendCommandТы забыл добавить что долго отправляет/принамает еще...
твой SendCommand обрывает соединение
finally
TcpClient1.Disconnect;
end;
и отправка идет в несколько соединений, а тут порядок никто не гарантирует!
если заменить SendCommand на TcpClient1.Sendln все должно работать
-
Slym © (15.02.08 6:10) [5]
TcpClient1.Sendln
ClientSocket.Sendln
-
> Display.Lines.Add(
Я не перестаю удивляться, как тебе нравится раз за разом получать одними и теми же граблями по одному и тому же лбу).. Мазохист ?)
Ты уже раза 3-4 приводил фрагменты своих обработчиков OnAccept, всякий раз тебе было сказано о недопустимости обращений к визуальным VCL-контролам в обработчике этого события, но ты по-прежнему делаешь одну и ту же упомянутую грубую ошибку)
-
2 Сергей М.
Ну вроде работает...
А как выводить информацию тогда, мне же так никто и не сказал..., кстати за основу этой проги взят пример из седьмой дельфи (Chat)...
-
> Ну вроде работает
Рано или поздно настанет "судный день" - в этот день ты обязательно получишь исключением (например, "canvas doesn't allow drawing") по лбу)
> как выводить информацию
Зачем ее выводить ? Для протокола что ли ?
> за основу этой проги взят пример из седьмой дельфи (Chat)
Там совсем другие компоненты использованы.
-
2 Сергей М.
>Зачем ее выводить ? Для протокола что ли ?
Ну это типа терминала, там мне нужно отправлять туда и обратно файло, как я без вывода информации то это делать буду, тем более я же привел одну из процедур (DIR), как я еще без вывода узнаю о содержимом удаленного винта?...
-
> Andrewtitoff © (15.02.08 10:28) [10]
Понятно.
Но в любом случае вывод инф-ции в визуальный VCL-контрол следует выполнять в основном потоке приложения.
-
Ясно, тут кстати вылезла еще одна проблемка, когда я пытаюсь переслать файл как я понял с системными атрибутами (с:\autorun.exe) то выскакивает ошибка Socket Error 10061, она кстати выскакивает периодически в процедуре DIR на удаленном конце при просмотре корня...
-
Может это все брандмауэр виндовсовский?...
-
Между файловыми атрибутами и упомянутой ошибкой нет никакой связи.
-
а в чем тогда может быть дело?
-
Небольшой вопросик не по теме:
Чем может быть вызвана ошибка "Cannot remove shell notification icon"?
-
10061 = WSAECONNREFUSED = The attempt to connect was forcefully rejected = Запрос на соединение (попытка коннекта к заданному порту) отвержен сервером (т.е. указанный клиентом порт сервера на момент попытки коннекта не активен)
-
> Andrewtitoff © (15.02.08 14:29) [16]
Ошибка, вероятно, возникает при вызове Shell_NotifyIcon() ?
-
Чегото я недопонимаю, а почему он неактивен, текст то он принимает....
Возникает на выходе из программы, там в oncloce только TrayIcon1.Visible:=false; стоит...