نرم افزار کلاینت سرور باید بنویسم ، سرور یک آیپی ثابت داره و کلاینت کانکت میشه به سرور و کلاینت باید یک فایل برای سرور ارسال کنه ، میشه ؟
نرم افزار کلاینت سرور باید بنویسم ، سرور یک آیپی ثابت داره و کلاینت کانکت میشه به سرور و کلاینت باید یک فایل برای سرور ارسال کنه ، میشه ؟
قبلاً در این مورد بحث شده : (چند سانتی متر پایین تر) اگه سوالی بود در همون تاپیک مطرح کنید تا در موردش بحث کنیم .
https://barnamenevis.org/showthread.php?t=228206
موفق باشید
سوال من فرق میکنه
برنامه کلاینت ( که IdTCPClient داره ) روی سیستم نصب میشه و آیپی سرور را بهش میدیم و وصل میشه به برنامه سرور ( که داره IdTCPServer )
اما اینجا کلاینت به سرور درخواست نمیده که سرور در جوابش فایل بفرسته
اینجا قراره نرم افزار کلاینت بعد از اینکه به سرور وصل شد یک فایل براش ارسال کنه همین
فرقی نمیکنه، هر وقت کلاینت به سرور Connect شد، میتونه با استفاده از TIdTcpClient.IoHander.WriteFile، فایل را به سرور ارسال کنه، و سرور هم در رویداد OnExecute خودش با استفاده از AContext.Connection.IoHander.ReadStream فایل رو دریافت کنه.اینجا قراره نرم افزار کلاینت بعد از اینکه به سرور وصل شد یک فایل براش ارسال کنه همین
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
مرسی اینجوری ؟
TIdTcpClient.IoHander.WriteFile('e:\em.jpg')
بلهاینجوری ؟
-------
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
و تو سرور اینجوری ؟ اگه آره که کار نمی کنه
s:=TMemoryStream.Create;
try
AContext.Connection.IOHandler.ReadStream(s);
except
ShowMessage('ٍError');
end;
s.SaveToFile('e:\ep.jpg');
s.free
اینجا دقیقاً داریم در مورد همین مشکل گفتگو میکنیم .
بعد از این دستور
AContext.Connection.IOHandler.ReadStream(s);
دیگه هیچی اجرا نمیشه
برنامه شما را که تو اون پست بود تغییر دادم نگاه کنید یکم عجیب نیست ؟؟؟؟؟؟؟؟؟؟
توی رویداد OnExecute سرور :
a:=a+1;
Caption:=IntTostr(a);
و a از نوع اینتجر ، توی آن کریت فرم هم مقدار 0 بهش دادم
برنامه را اجرا کنید !!! بعد از کانکت شدن به سرور همینجوری مقدار کپشن زیاد میشه !!!
یعنی این رویداد 24 ساعته فراخوانی میشه ؟!!!!
فعلا می تونید از IdCmdTcpServer به جای IdTcpServer استفاده کنید.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
فعلا نمی دونم؛ ولی با IdCmdTcpServer و ایجاد یک Command برای دریافت فایل از کلاینت، قبلا کار کردم، و همچین مشکلی نداشت.یعنی IdTcpServer مشکل داره ؟
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
idTCPClient هم باید عوض کنم ؟ برای IdCmdTcpServer بیشتر توضیح میدید که چجوری فایل را دریافت کنه ؟
می تونید از همون IdTcpClient استفاده کنید، یا از IdCmdTcpClient استفاده کنید. نحوه دریافت فایل فرقی نمیکنه، فقط به جای اینکه در رویداد OnExecute سرور کد را بنویسید، یک Command جدید در IdCmdTcpServer ایجاد می کنید، و کد مربوط به دریافت فایل را در رویداد آن می نویسید. هر زمان که کلاینت همان Command را به سرور ارسال کنه، سرور آن کد را اجرا میکنه.idTCPClient هم باید عوض کنم ؟ برای IdCmdTcpServer بیشتر توضیح میدید که چجوری فایل را دریافت کنه ؟
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
procedure idCmdTCPServerCommandHandlers0Command(ASender: TIdCommand);
به این گیر میده TIdCommand
IdCommandHandlers را به لیست uses یونیت اضافه کنید.به این گیر میده TIdCommand
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
یک کامند ساختم اما این
AContext.Connection.IOHandler.ReadStream(s);
که تو رویداد کامند سرور نمیشه نوشت !
اگر یک کم دقت کنید، میشه نوشت:یک کامند ساختم اما این
AContext.Connection.IOHandler.ReadStream(s);
که تو رویداد کامند سرور نمیشه نوشت !
ASender.Context.IOHander.ReadStream(S);
در ضمن، قبل از استفاده از ReadStream، حتما پست زیر رو مطالعه کنید:
http://www.barnamenevis.org/sh...4&postcount=15
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
مرسی ، کلاینت این دستو را دادم
سرور هم یک کامند تست داره که این کدشه
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;
یکی کمک کنه چند روزه که درگیر همینم ! و برنامه لنگ مونده !!!!
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;
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
مرسی
اگر از 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;
Command درست کنید، بهتر هست؛ چون رویداد OnExecute سرور دائما اجرا میشه، و کار خوبی نیست که هر وقت اون رویداد اجرا شد، همینطوری، بدون اینکه معلوم باشه درخواست اصلا چی بوده، یک Stream رو بخونید.اگر از write استفاده بشه سمت سرور توی رویداد OnExecute باید کد بنویسم یا کامند درست کنم و تونجا کد بنویسم ؟ از ReadStream استفاده کنم ؟
همین کد بالا که نوشتید، در یک Command Handler در سمت سرور به خوبی کار میکنه، فقط دقت کنید که در کد بالا، نام فایل رو ثابت در نظر گرفتید. اگر دو یا چند کلاینت بخوان همزمان به این سرور فایل ارسال کنند، همه میخوان در همین فایل 1.jpg بنویسند، که طبیعی هست که مشکل پیش میاد! باید یا برای هر کلاینت نام فایل هایی خودتون تولید کنید، یا اینکه نام فایل را به عنوان پارامتر از کلاینت بگیرید، و فایلی با همون نام در سمت سرور ایجاد کنید.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
مرســـــــــــــــــی کار کرد نام فایل را بفرستم ؟ اینجوری ؟
IdTCPClient1.SendCmd('Test','22.jpg');
بعد سمت سرور چی ؟ میشه این 22.jpg را تشخیص داد ؟
از طریق خصوصیت Params مربوط به ASender در رویداد مربوط به اون Command Handler.بعد سمت سرور چی ؟ میشه این 22.jpg را تشخیص داد ؟
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
مرسی.ASender.Params.Text این را نوشتم خطا میده ! موقع ارسال تو کلاینت بعد از ارسال کامند یک Writeln نوشتم و تو سرور قبل از readStream یک Readln نوشتم و نام فایل را اینجوری خوندم خوبه ؟ یا بهتره اینجوری باشه ؟ :
IdTCPClient1.SendCmd('Test','22.jpg');
اینجوری سمت سرور نمیشه گرفتش
Params یک لیسته، هر کدام از پارامترها به عنوان یکی از آیتم های این لیست هستند، که می تونید به هر کدامشون دسترسی داشته باشید، مثلا برای دریافت پارامتر اول، می تونید بنویسید:مرسی.ASender.Params.Text این را نوشتم خطا میده !
ASender.Params[0];
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
مرسی اول من همین کد نوشتم،اما خطا میده
این سمت کلاینت
IdTCPClient1.SendCmd('Test','1.jpg');
این هم سمت سرور و داخل رویداد کامند test
s:=ASender.Params[0];
و این هم خطا ها ! بعد ازاین 2 خطا برنامه پیغام میده "Welcome" !!!!
اون چیزی که نوشتید صحیح نیست!مرسی اول من همین کد نوشتم،اما خطا میده
شما در SendCmd، به جای Response، نام فایل را نوشتید، نه به عنوان پارامتر اون دستور!
شما در سمت سرور، باید نام Command و جدا کننده نام دستور از پارامترها، و جدا کننده پارامترها از هم را تعیین کنید.
در لیست CommandHandlers سرور، Command مربوطه رو انتخاب کنید، و در کادر مربوط به خصوصیت Command، اسم دستور را بنویسید (مثلا همان Test). برای خصوصیت ParamDelimiter هم یک مقدار غیر از 32# بنویسید (مثلا کارکتر کاما ,).
سپس در سمت کلاینت، با توجه به همان تنظیماتی که انجام دادید، دستور را به سرور ارسال کنید. در مثال بالا، ما دستور را Test تعریف کردیم. جدا کننده دستور از پارامترها Space هست، و جدا کننده پارامترها از هم کارکتر کاما، پس ما هم SendCmd را با توجه به این مقادیر می نویسیم، مثلا به این شکل:
SendCmd('Test Param1,Param2,Param3');این کد دستور Test رو با سه پارامتر تعیین شده ارسال میکنه. کل دستور و پارامترهاش به عنوان یک رشته به SendCmd ارسال میشند، نه به عنوان پارامترهای جداگانه. شما به عنوان پارامترهای SendCmd دقت نکردید.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.