View Full Version : سوال: مشکل با ارسال فایل در شبکه محلی
Mask
شنبه 27 فروردین 1390, 01:15 صبح
با سلام خدمت دوستان
در مورد ارسال فایل کلی جستجو کردم. یه چندین مثال رو دیدم:
یه نمونه بود که با سوکت ها کار میکرد که بنا به شرایط برنامم به دردم نخورد.
یه نمونه دیگه هم پیدا کردم که با کامند هندلر ایندی کار کرده بود که بازم بنا به شرایطی نمیتونم استفاده کنم.
من میخام از ایندی استفاده کنم اما بدون درگیری با کامند هندلر ها...
از دوستان تقاضا داشتم که اگه تکه کدی باشه که فقط :
یه ادیت بزارم رو فرمه برنامه کلاینت برای مسیر ، و در یه باتن کد بنویسم و با کلیک فایل ارسال بشه برای سرور.
به همین سادگی...:قلب::خجالت:
ممنون میشم کمک کنید.
مهران رسا
شنبه 27 فروردین 1390, 01:48 صبح
بنا به شرایط برنامم
این شرایط برنامه شما چی هست ؟ میشه ما هم بدونیم ؟ چه کد هایی رو مشاهده کردید که به دردتون نخورد و چرا ؟ با Winsock میخواین اینکار رو انجام بدید یا Indy ؟
Mask
شنبه 27 فروردین 1390, 01:56 صبح
ممنون
میخام از indy و دلفی 7 استفاده کنم.
فقط خیلی راحت و روون.
این نمونه کد رو خودم نوشتم . اما مشکلش اینه که فایل رو کامل نمیفرسته . فایلی رو که میخام با این برنامه ارسال کنم کمتر از 100k هست.
کد برنامه کلاینت:
procedure TForm1.Button1Click(Sender: TObject);
var Filestream:TFileStream;
begin
Filestream:=TFileStream.Create(Edit1.Text,fmOpenRe ad);
IdTCPClient1.Connect;
try
IdTCPClient1.WriteStream(Filestream);
finally
Filestream.Free;
IdTCPClient1.Disconnect
end;
end;
کد برنامه سرور :
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
FileStream : TFileStream;
begin
FileStream := TFileStream.Create(ExtractFilePath(Application.Exe Name)+'1.txt', fmCreate);
try
AThread.Connection.ReadStream(FileStream);
Finally
FileStream.Free;
end;
end;
به نظرم مشکل از سایزی هست که استریم میتونه ارسال کنه . اگه ممکنه دوستان کدم رو اصلاح کنند .
ممنون .
vcldeveloper
شنبه 27 فروردین 1390, 14:09 عصر
IdTCPClient1.WriteStream(Filestream,0,True);
Mask
شنبه 27 فروردین 1390, 15:48 عصر
ممنون علی آقا
زحمت کشیدید.
کدم رو با نمونه شما اصلاح کردم اما ارور زیر رو میده.
[Error] Unit1.pas(35): Incompatible types: 'Boolean' and 'Integer'
خودم یه تغییراتی دادم و مشکلم تا حدودی حل شد.
اما بازم با فایلهای با حجم بالا مشکل دارم.
به نظرتون باید فایل رو تکه تکه بفرستم یا راه بهتری دارید؟
کلاینت:
procedure TForm1.Button1Click(Sender: TObject);
var Filestream:TFileStream;
begin
Filestream:=TFileStream.Create(Edit1.Text,fmOpenRe ad);
IdTCPClient1.Connect;
try
IdTCPClient1.WriteInteger(Filestream.Size);
IdTCPClient1.OpenWriteBuffer();
IdTCPClient1.WriteStream(Filestream);
finally
IdTCPClient1.CloseWriteBuffer;
Filestream.Free;
IdTCPClient1.Disconnect
end;
end;
سرور:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
FileStream : TFileStream;
size:Integer;
begin
FileStream := TFileStream.Create(ExtractFilePath(Application.Exe Name)+'1.txt', fmCreate);
try
size:=AThread.Connection.ReadInteger();
ShowMessage(IntToStr(size));
AThread.Connection.ReadStream(FileStream,size,true );
Finally
FileStream.Free;
end;
end;
vcldeveloper
شنبه 27 فروردین 1390, 22:47 عصر
اما بازم با فایلهای با حجم بالا مشکل دارم.
حجم بالا یعنی حدودا چقدر؟
Mask
یک شنبه 28 فروردین 1390, 11:39 صبح
مثلا وقتی یه فایل 100مگی رو میفرستم برنامه قفل میشه.با اینکه از آنتی فریز هم استفاده کردم.
vcldeveloper
یک شنبه 28 فروردین 1390, 15:45 عصر
مثلا وقتی یه فایل 100مگی رو میفرستم برنامه قفل میشه.با اینکه از آنتی فریز هم استفاده کردم.
قبلا هم گفتم، AntiFreeze ساده ترین راه هست، نه بهترین راه. AntiFreeze فقط در فواصل معین یک وقفه در انجام کار Indy ایجاد میکنه، که برنامه بتونه رابط کاربرش را بروزرسانی کنه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.