View Full Version : ارسال فایل با IdTCPClient
sara66
شنبه 02 مرداد 1389, 10:23 صبح
نرم افزار کلاینت سرور باید بنویسم ، سرور یک آیپی ثابت داره و کلاینت کانکت میشه به سرور و کلاینت باید یک فایل برای سرور ارسال کنه ، میشه ؟
مهران رسا
شنبه 02 مرداد 1389, 12:46 عصر
نرم افزار کلاینت سرور باید بنویسم ، سرور یک آیپی ثابت داره و کلاینت کانکت میشه به سرور و کلاینت باید یک فایل برای سرور ارسال کنه ، میشه ؟
قبلاً در این مورد بحث شده : (چند سانتی متر پایین تر) اگه سوالی بود در همون تاپیک مطرح کنید تا در موردش بحث کنیم .
http://barnamenevis.org/forum/showthread.php?t=228206
موفق باشید
sara66
شنبه 02 مرداد 1389, 19:06 عصر
سوال من فرق میکنه
برنامه کلاینت ( که IdTCPClient داره ) روی سیستم نصب میشه و آیپی سرور را بهش میدیم و وصل میشه به برنامه سرور ( که داره IdTCPServer )
اما اینجا کلاینت به سرور درخواست نمیده که سرور در جوابش فایل بفرسته
اینجا قراره نرم افزار کلاینت بعد از اینکه به سرور وصل شد یک فایل براش ارسال کنه همین
vcldeveloper
شنبه 02 مرداد 1389, 19:53 عصر
اینجا قراره نرم افزار کلاینت بعد از اینکه به سرور وصل شد یک فایل براش ارسال کنه همین
فرقی نمیکنه، هر وقت کلاینت به سرور Connect شد، میتونه با استفاده از TIdTcpClient.IoHander.WriteFile، فایل را به سرور ارسال کنه، و سرور هم در رویداد OnExecute خودش با استفاده از AContext.Connection.IoHander.ReadStream فایل رو دریافت کنه.
sara66
یک شنبه 03 مرداد 1389, 09:43 صبح
مرسی اینجوری ؟
TIdTcpClient.IoHander.WriteFile('e:\em.jpg')
vcldeveloper
یک شنبه 03 مرداد 1389, 12:51 عصر
اینجوری ؟
بله
-------
sara66
یک شنبه 03 مرداد 1389, 13:27 عصر
و تو سرور اینجوری ؟ اگه آره که کار نمی کنه
s:=TMemoryStream.Create;
try
AContext.Connection.IOHandler.ReadStream(s);
except
ShowMessage('ٍError');
end;
s.SaveToFile('e:\ep.jpg');
s.free
مهران رسا
یک شنبه 03 مرداد 1389, 14:07 عصر
و تو سرور اینجوری ؟ اگه آره که کار نمی کنه
s:=TMemoryStream.Create;
try
AContext.Connection.IOHandler.ReadStream(s);
except
ShowMessage('ٍError');
end;
s.SaveToFile('e:\ep.jpg');
s.free
اینجا (http://barnamenevis.org/forum/showthread.php?t=234286&page=2) دقیقاً داریم در مورد همین مشکل گفتگو میکنیم .
sara66
یک شنبه 03 مرداد 1389, 17:34 عصر
بعد از این دستور
AContext.Connection.IOHandler.ReadStream(s);
دیگه هیچی اجرا نمیشه
sara66
یک شنبه 03 مرداد 1389, 17:47 عصر
برنامه شما را که تو اون پست بود تغییر دادم نگاه کنید یکم عجیب نیست ؟؟؟؟؟؟؟؟؟؟
توی رویداد OnExecute سرور :
a:=a+1;
Caption:=IntTostr(a);
و a از نوع اینتجر ، توی آن کریت فرم هم مقدار 0 بهش دادم
برنامه را اجرا کنید !!! بعد از کانکت شدن به سرور همینجوری مقدار کپشن زیاد میشه !!!
یعنی این رویداد 24 ساعته فراخوانی میشه ؟!!!!
vcldeveloper
یک شنبه 03 مرداد 1389, 22:41 عصر
فعلا می تونید از IdCmdTcpServer به جای IdTcpServer استفاده کنید.
مهران رسا
یک شنبه 03 مرداد 1389, 23:01 عصر
فعلا می تونید از IdCmdTcpServer به جای IdTcpServer استفاده کنید.
یعنی IdTcpServer مشکل داره ؟
vcldeveloper
دوشنبه 04 مرداد 1389, 00:46 صبح
یعنی IdTcpServer مشکل داره ؟
فعلا نمی دونم؛ ولی با IdCmdTcpServer و ایجاد یک Command برای دریافت فایل از کلاینت، قبلا کار کردم، و همچین مشکلی نداشت.
sara66
دوشنبه 04 مرداد 1389, 10:02 صبح
idTCPClient هم باید عوض کنم ؟ برای IdCmdTcpServer بیشتر توضیح میدید که چجوری فایل را دریافت کنه ؟
vcldeveloper
دوشنبه 04 مرداد 1389, 13:57 عصر
idTCPClient هم باید عوض کنم ؟ برای IdCmdTcpServer بیشتر توضیح میدید که چجوری فایل را دریافت کنه ؟
می تونید از همون IdTcpClient استفاده کنید، یا از IdCmdTcpClient استفاده کنید. نحوه دریافت فایل فرقی نمیکنه، فقط به جای اینکه در رویداد OnExecute سرور کد را بنویسید، یک Command جدید در IdCmdTcpServer ایجاد می کنید، و کد مربوط به دریافت فایل را در رویداد آن می نویسید. هر زمان که کلاینت همان Command را به سرور ارسال کنه، سرور آن کد را اجرا میکنه.
sara66
دوشنبه 04 مرداد 1389, 16:54 عصر
procedure idCmdTCPServerCommandHandlers0Command(ASender: TIdCommand);
به این گیر میده TIdCommand
vcldeveloper
دوشنبه 04 مرداد 1389, 18:27 عصر
به این گیر میده TIdCommand
IdCommandHandlers را به لیست uses یونیت اضافه کنید.
sara66
دوشنبه 04 مرداد 1389, 19:49 عصر
یک کامند ساختم اما این
AContext.Connection.IOHandler.ReadStream(s);
که تو رویداد کامند سرور نمیشه نوشت !
vcldeveloper
سه شنبه 05 مرداد 1389, 21:08 عصر
یک کامند ساختم اما این
AContext.Connection.IOHandler.ReadStream(s);
که تو رویداد کامند سرور نمیشه نوشت !
اگر یک کم دقت کنید، میشه نوشت:
ASender.Context.IOHander.ReadStream(S);
در ضمن، قبل از استفاده از ReadStream، حتما پست زیر رو مطالعه کنید:
http://www.barnamenevis.org/forum/showpost.php?p=1050014&postcount=15
sara66
چهارشنبه 06 مرداد 1389, 10:00 صبح
مرسی ، کلاینت این دستو را دادم
TCPClinet.SendCmd('Test');
TCPClinet.IOHandler.WriteFile('file.txt');
سرور هم یک کامند تست داره که این کدشه
procedure TForm1.TCPServerCommandHandlers0Command(ASender: TIdCommand);
var
s:TMemoryStream;
begin
s:=TMemoryStream.Create;
ASender.Context.Connection.IOHandler.ReadStream(s) ;
s.SaveToFile('e:\el.txt');
s.Free;
end;
نمیشه گیر کردم
sara66
شنبه 09 مرداد 1389, 08:14 صبح
یکی کمک کنه چند روزه که درگیر همینم ! و برنامه لنگ مونده !!!!
vcldeveloper
یک شنبه 10 مرداد 1389, 16:17 عصر
مرسی ، کلاینت این دستو را دادم
WriteFile اندازه فایل را قبل از ارسال فایل، به سرور ارسال نمیکنه، ReadStream هم منتظر دریافت اندازه فایل هست. شما می تونید اندازه فایل را به شکل های مختلفی به سرور ارسال کنید. یک حالتش اینه که با Command ارسالی، یک پارامتر هم ارسال کنید که حاوی اندازه فایل باشه. یک حالت دیگه اش اینه که قبل از فراخوانی WriteFile، با WriteInteger اندازه فایل را ارسال کنید. حالت دیگه اش هم این هست که شما از متد Write به جای WriteFile استفاده کنید. در این صورت، می تونید فایل رو به صورت Stream (با استفاده از TFileStream) به متد Write بدید، و مقدار پارامتر AWriteByteCount آن را True کنید:
var
Stream : TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead, fmShareDenyWrite);
try
IdTCPClient1.IOHandler.Write(Stream,0,True);
finally
Stream.Free;
end;
end;
sara66
یک شنبه 10 مرداد 1389, 17:11 عصر
مرسی
اگر از write استفاده بشه سمت سرور توی رویداد OnExecute باید کد بنویسم یا کامند درست کنم و تونجا کد بنویسم ؟ از ReadStream استفاده کنم ؟
اینجوری ؟
var
s:TFileStream;
begin
s:=TFileStream.Create('e:\1.jpg',fmCreate,fmOpenRe adWrite);
ASender.Context.Connection.IOHandler.ReadStream(s) ;
s.Free;
end;
vcldeveloper
یک شنبه 10 مرداد 1389, 18:02 عصر
اگر از write استفاده بشه سمت سرور توی رویداد OnExecute باید کد بنویسم یا کامند درست کنم و تونجا کد بنویسم ؟ از ReadStream استفاده کنم ؟
Command درست کنید، بهتر هست؛ چون رویداد OnExecute سرور دائما اجرا میشه، و کار خوبی نیست که هر وقت اون رویداد اجرا شد، همینطوری، بدون اینکه معلوم باشه درخواست اصلا چی بوده، یک Stream رو بخونید.
همین کد بالا که نوشتید، در یک Command Handler در سمت سرور به خوبی کار میکنه، فقط دقت کنید که در کد بالا، نام فایل رو ثابت در نظر گرفتید. اگر دو یا چند کلاینت بخوان همزمان به این سرور فایل ارسال کنند، همه میخوان در همین فایل 1.jpg بنویسند، که طبیعی هست که مشکل پیش میاد! باید یا برای هر کلاینت نام فایل هایی خودتون تولید کنید، یا اینکه نام فایل را به عنوان پارامتر از کلاینت بگیرید، و فایلی با همون نام در سمت سرور ایجاد کنید.
sara66
دوشنبه 11 مرداد 1389, 08:22 صبح
مرســـــــــــــــــی کار کرد نام فایل را بفرستم ؟ اینجوری ؟
IdTCPClient1.SendCmd('Test','22.jpg');
بعد سمت سرور چی ؟ میشه این 22.jpg را تشخیص داد ؟
vcldeveloper
دوشنبه 11 مرداد 1389, 13:11 عصر
بعد سمت سرور چی ؟ میشه این 22.jpg را تشخیص داد ؟
از طریق خصوصیت Params مربوط به ASender در رویداد مربوط به اون Command Handler.
sara66
دوشنبه 11 مرداد 1389, 18:12 عصر
مرسی.ASender.Params.Text این را نوشتم خطا میده ! موقع ارسال تو کلاینت بعد از ارسال کامند یک Writeln نوشتم و تو سرور قبل از readStream یک Readln نوشتم و نام فایل را اینجوری خوندم خوبه ؟ یا بهتره اینجوری باشه ؟ :
IdTCPClient1.SendCmd('Test','22.jpg');
اینجوری سمت سرور نمیشه گرفتش
vcldeveloper
سه شنبه 12 مرداد 1389, 00:02 صبح
مرسی.ASender.Params.Text این را نوشتم خطا میده !
Params یک لیسته، هر کدام از پارامترها به عنوان یکی از آیتم های این لیست هستند، که می تونید به هر کدامشون دسترسی داشته باشید، مثلا برای دریافت پارامتر اول، می تونید بنویسید:
ASender.Params[0];
sara66
سه شنبه 12 مرداد 1389, 08:24 صبح
مرسی اول من همین کد نوشتم،اما خطا میده
این سمت کلاینت
IdTCPClient1.SendCmd('Test','1.jpg');
این هم سمت سرور و داخل رویداد کامند test
s:=ASender.Params[0];
و این هم خطا ها ! بعد ازاین 2 خطا برنامه پیغام میده "Welcome" !!!!
vcldeveloper
سه شنبه 12 مرداد 1389, 14:23 عصر
مرسی اول من همین کد نوشتم،اما خطا میده اون چیزی که نوشتید صحیح نیست!
شما در SendCmd، به جای Response، نام فایل را نوشتید، نه به عنوان پارامتر اون دستور!
شما در سمت سرور، باید نام Command و جدا کننده نام دستور از پارامترها، و جدا کننده پارامترها از هم را تعیین کنید.
در لیست CommandHandlers سرور، Command مربوطه رو انتخاب کنید، و در کادر مربوط به خصوصیت Command، اسم دستور را بنویسید (مثلا همان Test). برای خصوصیت ParamDelimiter هم یک مقدار غیر از 32# بنویسید (مثلا کارکتر کاما ,).
سپس در سمت کلاینت، با توجه به همان تنظیماتی که انجام دادید، دستور را به سرور ارسال کنید. در مثال بالا، ما دستور را Test تعریف کردیم. جدا کننده دستور از پارامترها Space هست، و جدا کننده پارامترها از هم کارکتر کاما، پس ما هم SendCmd را با توجه به این مقادیر می نویسیم، مثلا به این شکل:
SendCmd('Test Param1,Param2,Param3');این کد دستور Test رو با سه پارامتر تعیین شده ارسال میکنه. کل دستور و پارامترهاش به عنوان یک رشته به SendCmd ارسال میشند، نه به عنوان پارامترهای جداگانه. شما به عنوان پارامترهای SendCmd دقت نکردید.
sara66
سه شنبه 12 مرداد 1389, 17:30 عصر
مرسی درست شد
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.