در این مقاله نحوه ارسال فایل های بزرگ از هر نوع پسوند و با هر اندازه ای از طریق سوکت شبکه توضیح داده می شود. فایل ها به جای ارسال یکباره به صورت تکه هایی با اندازه از پیش تعیین شده ارسال می شوند. با ارسال فایل های حجیم به صورت تکه، قادر به محاسبه و گزارش پیشرفت انتقال فایل خواهیم بود.
توجه داشته باشید
برای سادگی، این قابلیت برای اجرای ناهمزمان پیاده سازی نشده است.
فایل را در FileStream بخوانید
long totalBytes = file.Length, bytesSoFar = 0;
این فایل را از مسیر فایل در FileStream بارگذاری می کند و طول فایل را برای محاسبه پیشرفت نشان می دهد.
راه اندازی نقطه پایانی و سوکت
Socket sock = new Socket(deviceAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
sock.SendTimeout = 1000000; //timeout in milliseconds
sock.Connect(endpoint);
یک نقطه پایانی برای آدرس IP دستگاه متصل به شبکه ایجاد کنید و در اینجا پورت استفاده شده 9100 است (این می تواند هر پورتی باشد). Socket را راه اندازی کنید و مقدار وقفه را در میلی ثانیه تعیین کنید.
Sock.Connect یک اتصال به سوکت شبکه از طریق پورت مشخص شده برقرار می کند.
فایل را به Chunks تبدیل کرده و از طریق سوکت ارسال کنید
int numBytes;
while ((numBytes = file.Read(filechunk, 0, 4096)) > 0) {
if (sock.Send(filechunk, numBytes, SocketFlags.None) != numBytes) {
throw new Exception("Error in sending the file");
}
bytesSoFar += numBytes;
Byte progress = (byte)(bytesSoFar * 100 / totalBytes);
if (progress > lastStatus && progress != 100) {
Console.WriteLine("File sending progress:{0}", lastStatus);
lastStatus = progress;
}
}
sock.Shutdown(SocketShutdown.Both);
کد بالا فایل را به تکه هایی با اندازه 4096 بایت تبدیل کرده و از طریق سوکت شبکه ارسال می کند. پیشرفت فایل در حال انتقال محاسبه می شود و پیشرفت نمایش داده می شود.
در نهایت سوکت خاموش می شود و جریان ها بسته می شوند.
کد کامل
int lastStatus = 0;
FileStream file = new FileStream(filePath, FileMode.Open);;
long totalBytes = file.Length, bytesSoFar = 0;
IPEndPoint endpoint = new IPEndPoint(deviceAddr, 9100);
Socket sock = new Socket(deviceAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
sock.SendTimeout = 1000000; //timeout in milliseconds
try {
sock.Connect(endpoint);
byte[] filechunk = new byte[4096];