PDA

View Full Version : ارسال فایل به کلاینت ها از طریق متد Socket Programing



Sp|R|T
سه شنبه 22 مرداد 1392, 10:07 صبح
سلام من قصد دارم یه برنامه ای رو بنویسم که بشه یه فایل رو از طرف سرور به کلاینت ها ارسال کرد من واسه اینکار از متد Socket Programing استفاده کردم و الان بدون هچی مشکلی برنامم داره کار میکنه
ولی الان میخوام یکم توسعش بدم که وقتی فایل بصورت "کامل" ارسال شد، یه کارهای دیگه ای رو انجام بده
من الان دقیق نمیدونم که چطور شرط بزارم که آیا فایل بصورت کامل ارسال شده یا خیر
خب، این یه قسمتی از کدم هستش که فایل رو ارسال میکنه:


public void SendFile(string remoteHostIP, int remoteHostPort, string longFileName, string shortFileName)
{
try
{
if (!string.IsNullOrEmpty(remoteHostIP))
{
byte[] fileNameByte = Encoding.ASCII.GetBytes(shortFileName);
byte[] fileData = File.ReadAllBytes(longFileName);
byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
fileNameLen.CopyTo(clientData, 0);
fileNameByte.CopyTo(clientData, 4); fileData.CopyTo(clientData, 4 + fileNameByte.Length);
TcpClient clientSocket = new TcpClient(remoteHostIP, remoteHostPort);
NetworkStream networkStream = clientSocket.GetStream();
networkStream.Write(clientData, 0, clientData.GetLength(0));
networkStream.Close();
MessageBox.Show("فایل ارسال شد");
}
else
{
MessageBox.Show("فایل ارسال نشد");
}
}
catch
{
MessageBox.Show("خطا در ارسال");
}
}

اگه دقت کنید، اونجا که نوشتم "فایل ارسال شد" میخوام قبلش یه شرط قرار بدم که چک کنه آیا فایل بصورت کامل ارسال شده یا خیر!
الان دقیق برنامم اینجوری کار میکنه؛ وقتی یه فایل با حجم بالا ارسال میکنم، بعد از 2 الی 3 ثانیه اون پیغام "فایل ارسال شد" رو نشون میده، در صورتی که میبینم هنوز فایل بصورت کامل ارسال نشده و فایل بصورت مخفی داره ارسال میشه که اینکار باعث میشه کاربر طرف سرور نفهمه که کِی فایل بصورت کامل ارسال شده!
امیدوارم منظورم رو گرفته باشید. :)
ممنونم

FastCode
سه شنبه 22 مرداد 1392, 15:31 عصر
بعد از خط
networkStream.Write(clientData, 0, clientData.GetLength(0));
مقدار NoDelay رو true کنید.باعث میشه socket بلافاصله flush کنه.
در ضمن بهتر هست که از SendFile استفاده کنید تا این کار به شکل خودکار انجام بشه و
۱.حافظه اختصاص یافته به برنامتون کمتر مصرف بشه
۲.زمانبندی توسط کرنل و با الویت بالاتر انجام بشه
۳.latency کمتری داشته باشید.
۴.کدتون ساده تر بشه.

Sp|R|T
سه شنبه 22 مرداد 1392, 22:41 عصر
بعد از خط
networkStream.Write(clientData, 0, clientData.GetLength(0));
مقدار NoDelay رو true کنید.باعث میشه socket بلافاصله flush کنه.
در ضمن بهتر هست که از SendFile استفاده کنید تا این کار به شکل خودکار انجام بشه و
۱.حافظه اختصاص یافته به برنامتون کمتر مصرف بشه
۲.زمانبندی توسط کرنل و با الویت بالاتر انجام بشه
۳.latency کمتری داشته باشید.
۴.کدتون ساده تر بشه.

ممنونم استاد

ولی با یه مثال کوچیک توضیح بدین ممنونم میشم

FastCode
چهارشنبه 23 مرداد 1392, 00:19 صبح
http://msdn.microsoft.com/en-us/library/ms145164.aspx

Sp|R|T
چهارشنبه 23 مرداد 1392, 01:33 صبح
http://msdn.microsoft.com/en-us/library/ms145164.aspx

استاد من بنا به یه دلایلی دارم از سوکت استفاده میکنم، و الان فقط مشکلم همون گذاشتن شرط هسش ... :-s

فقط میخوام یه شرطی به اون قطعه کد بالایی اضافه کنم که وقتی فایل بصورت کامل آپلود شد، یه پیغام نشون بده...

FastCode
چهارشنبه 23 مرداد 1392, 02:05 صبح
دقیقا چه دلیلی؟اینطوری خیلی راحت میتونید فایل رو بفرستید.حتی اون قسمت هایی رو هم که به اول فایل اضافه کردید رو هم به شکل ویژه پشتیبانی میکنه.