PDA

View Full Version : سوال: تبدیل فایل به بایت و ارسال به کلاینت در سوکت



sadaf_
چهارشنبه 17 خرداد 1391, 14:47 عصر
سلام
آیا کسی نمونه ای در این مورد داره که فایل رو به بایت تبدیل کنم
و آن را به صورت بسته بسته ارسال کنم به کلاینت؟

Saeed_m_Farid
چهارشنبه 17 خرداد 1391, 16:12 عصر
سلام
آیا کسی نمونه ای در این مورد داره که فایل رو به بایت تبدیل کنم
و آن را به صورت بسته بسته ارسال کنم به کلاینت؟
آیا شما نمونه ای غیر از این مورد دارین؟! فایل رو مگه قراره چطوری بفرستین غیر از آرایه بایت و آنرا بسته بسته ارسال کنید به کلاینت؟ مگه اینکه مثلاً سریال XML (http://www.dotnetspider.com/resources/408-XML-serialization-Binary-serialization.aspx) بفرستین که فکر نمیکنم همچین کاری کرده باشید.
کافی بود تو تالار #C دنبال Socket بگردین، هزار تا مطلب لیست میشد، در گوگل 1,660,000 ...

یه نمونه ساده: (اصل برنامه از اینجا برداشته شود! (http://www.codeproject.com/Articles/32633/Sending-Files-using-TCP))


ارسال : public void SendTCP(string M, string IPA, Int32 PortN)
{
byte[] SendingBuffer = null;
TcpClient client = null;
lblStatus.Text = "";
NetworkStream netstream = null;
try
{
client = new TcpClient(IPA, PortN);
lblStatus.Text = "Connected to the Server...\n";
netstream = client.GetStream();
FileStream Fs = new FileStream(M, FileMode.Open, FileAccess.Read);
int NoOfPackets = Convert.ToInt32
(Math.Ceiling(Convert.ToDouble(Fs.Length) / Convert.ToDouble(BufferSize)));
progressBar1.Maximum = NoOfPackets;
int TotalLength = (int)Fs.Length, CurrentPacketLength, counter = 0;
for (int i = 0; i < NoOfPackets; i++)
{
if (TotalLength > BufferSize)
{
CurrentPacketLength = BufferSize;
TotalLength = TotalLength - CurrentPacketLength;
}
else
CurrentPacketLength = TotalLength;
SendingBuffer = new byte[CurrentPacketLength];
Fs.Read(SendingBuffer, 0, CurrentPacketLength);
netstream.Write(SendingBuffer, 0, (int)SendingBuffer.Length);
if (progressBar1.Value >= progressBar1.Maximum)
progressBar1.Value = progressBar1.Minimum;
progressBar1.PerformStep();
}

lblStatus.Text=lblStatus.Text+"Sent, "+Fs.Length.ToString()+" bytes to the server";
Fs.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
netstream.Close();
client.Close();
}
}

دریافت : public void ReceiveTCP(int portN)
{
TcpListener Listener = null;
try
{
Listener = new TcpListener(IPAddress.Any, portN);
Listener.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

byte[] RecData = new byte[BufferSize];
int RecBytes;

for (; ; )
{
TcpClient client = null;
NetworkStream netstream = null;
Status = string.Empty;
try
{
string message = "Accept the Incoming File ";
string caption = "Incoming Connection";
MessageBoxButtons buttons = MessageBoxButtons.YesNo;
DialogResult result;

if (Listener.Pending())
{
client = Listener.AcceptTcpClient();
netstream = client.GetStream();
Status = "Connected to a client\n";
result = MessageBox.Show(message, caption, buttons);

if (result == System.Windows.Forms.DialogResult.Yes)
{
string SaveFileName=string.Empty;
SaveFileDialog DialogSave = new SaveFileDialog();
DialogSave.Filter = "All files (*.*)|*.*";
DialogSave.RestoreDirectory = true;
DialogSave.Title = "Where do you want to save the file?";
DialogSave.InitialDirectory = @"C:/";
if (DialogSave.ShowDialog() == DialogResult.OK)
SaveFileName = DialogSave.FileName;
if (SaveFileName != string.Empty)
{
int totalrecbytes = 0;
FileStream Fs = new FileStream
(SaveFileName, FileMode.OpenOrCreate, FileAccess.Write);
while ((RecBytes = netstream.Read
(RecData, 0, RecData.Length)) > 0)
{
Fs.Write(RecData, 0, RecBytes);
totalrecbytes += RecBytes;
}
Fs.Close();
}
netstream.Close();
client.Close();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
//netstream.Close();
}
}
}

* یکمی بهتر (http://www.csharphelp.com/2006/10/client-server-simple-file-sharing-and-file-transfer/)
* BITS (http://www.codeproject.com/Articles/15471/Forms-Designer-Friendly-Background-Intelligent-Tra) و + (http://www.csharphelp.com/2006/10/client-server-simple-file-sharing-and-file-transfer/) (برای فابلهای بزرگتر از 2 گیگ)

sadaf_
چهارشنبه 17 خرداد 1391, 22:02 عصر
این نمونه کد حطا می ده لطفا راهنمایی کنید

Saeed_m_Farid
پنج شنبه 18 خرداد 1391, 09:15 صبح
این نمونه کد حطا می ده لطفا راهنمایی کنید
همونطوریکه خودتون گفتید این نمونه کد هست، نه برنامه کامل؛ شما توابع رو کپی کردین تو برنامه تون و انتظار دارین کار کنن؟:متعجب:
این نمونه کد برای آشنایی با split کردن فایل به بخش های کوچک نوشته شده! هر تکه از آرایه بایت ها که از فایل خونده شده و فرستاده میشه، اندازشون BufferSize هست، که شما باید یه const عددی به این نام تو برنامه تعریف کنید، یه label بنام lblStatus و یه ProgressBar بنام progressBar1 روی فرمتون بیاندازید! اصلاً پست رو ویرایش می کنم، از اونجا اصل برنامه رو بردارین :(
ولی باور کنید این راهی که میرین به ترکستان است، آخه این کپی کردن ها آخرش چه مزیتی براتون داره؟ بپرسین اینجای کد چکار میکنه، چرا فلان جا اونطوری عمل کرده و ...؛ شما حتی به منبع کد هم مراجعه نکردین!

sadaf_
پنج شنبه 18 خرداد 1391, 12:08 عصر
از راهنمایی های شما ممنونم جناب Saeed_m_Farid (http://barnamenevis.org/member.php?41415-Saeed_m_Farid)
دستور دریافت

Listener.Start();

وقتی به خط می رسه خطا می ده
چرا؟

saman_h
پنج شنبه 18 خرداد 1391, 13:13 عصر
سلام دوست عزیز
دوتا نمونه ساده و قابل فهم واستون میذارم ( البته یکیش یکم سخته و باید توی Visual Studio 2010 ) اونو تست کنیدا :
http://www.codeproject.com/KB/cs/SocketApplication/FileTransfer.zip
http://www.codeproject.com/script/articles/download.aspx?file=/KB/cs/SocketApplication/FileTransfer.zip&rp=http://www.codeproject.com/Articles/24017/File-Transfer-using-Socket-Application-in-C-NET-2

منم خودم دارم روی برنامه چت کار میکنم کمکی خواستید در خدمتم

sadaf_
جمعه 19 خرداد 1391, 15:10 عصر
از دوستان خواهشمندم بیستر کمکم کنند
من باید فایل رو 1024 بایت 1024 بایت بفرستم به کلاینت

sadaf_
شنبه 20 خرداد 1391, 14:37 عصر
کسی نیست یه کمکی کنه

Saeed_m_Farid
شنبه 20 خرداد 1391, 19:21 عصر
وقتی به خط می رسه خطا می ده
پورت چی میدین؟ Exception چیه؟
اگه System.ArgumentNullException بگیرین، یعنی کامپیوترتون تو شبکه نیست؛ و اگه System.ArgumentOutOfRangeException بگیرین، یعنی پورت رو غلط دادین (باید بین 0 تا 65535 باشه) ...
ضمناً چون سوال شما مربوط به فرستادن chunk های بایت بود، من سمت ارسال (SendTCP) رو بیشتر توجه کردم، بنابراین تو این مثال تابع سمت دریافت (ReceiveTCP) الکی و سرسری نوشته شده، تو یه حلقه بی نهایت Receive میکنه و این باعث میشه برنامه شما دائماً تو هنگ باشه! بهتره تو یه Thread از Delegate استفاده کنید، یا از BackgroundWorker (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx)... یا یه سرور آماده پیدا کنید!




کسی نیست یه کمکی کنه
از دوستان خواهشمندم بیستر کمکم کنند


مطمئن باشید من یکی که تا شما فدمی برندارین؛ 26000 سال هم پ.خ.، کسی نیست، خواهشمندم و ... بکنید، از لقمه آماده امتنان کردمی! مگه اینکه اشکال بپرسین، جواب بگیرین! دوستان دیگه صاحب اختیار هستن.