V0R73X
پنج شنبه 30 تیر 1390, 06:27 صبح
سلام دوستان.
دیدم تو فروم C# درباره سوکت ها بحث شده گفتم یه آموزش بزارم امیدوارم خوشتون بیاد (این دومیشه!)
خوب ببینید در یک جمله سوکت پروگرامینگ یعنی اینکه بیایم یک سری اطلاعات رو با یک سری شیء به نام سوکت از یک Device یه یک Device دیگه منتقل کنیم. حالا این Device هر چیزی میتونه باشه روبات یا کامپیوتر یا کنسول بازی!
تو این پروسه دو سیستم (یا همون Device) دخیلند: یکی سمتی که میفرسته (Client) و یکی هم سمتی که دریافت میکنه (server). خوب است بدانید که اینترنت هم خودش مجموعه بسیار عظیمی از سوکت های گوناگونه، و وقتی که شما مثلا وارد سایت برنامه نویس میشید به سورو حاوی این سایت یک درخواست میفرستید که این درخواست ها یه صورت یک سری بسته های اطلاعات رد و بدل میشند. پس شما میشید هون کلاینت! سرور حاوی سایت بعد از اینکه درخواست شما رو دریافت کرد اون رو پردازش میکنه و پاسخ مناسبی به شما میده مثلا صفحه ی اول سایت برنامه نویس!
خوب میبینید که هر طرف کار متفاوتی انجام میده پس Socket Programming سرور با کلاینت فرق داره که من در این آموزش هر دو را با سورس کد آموزش میدم. باور کنید کد رو که نگاه کنید همه چیز براتون واضح میشه مخصوصا اگر قبلا تو cmd با پینگ، پروتوکل ها و... سروکار داشتید. کسانی هم که با برنامه نویسی سریال آشنایی دارند هم سوکت پروگرامینگ رو بسیار آسون یاذ میگیرند.
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace Client_Socket
{
//FILE TRANSFER USING C#.NET SOCKET - CLIENT
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("That program can transfer small file. I've test up to 850kb file");
IPAddress[] ipAddress = Dns.GetHostAddresses("localhost");
IPEndPoint ipEnd = new IPEndPoint(ipAddress[0], 5656);
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
clientSock.Connect(ipEnd);
byte[] clientData = new byte[1024 * 5000];
string receivedPath = "C:/";
int receivedBytesLen = clientSock.Receive(clientData);
int fileNameLen = BitConverter.ToInt32(clientData, 0);
string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
Console.WriteLine("Client:{0} connected & File {1} started received.", clientSock.RemoteEndPoint, fileName);
BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + fileName, FileMode.Append)); ;
bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
Console.WriteLine("File: {0} received & saved at path: {1}", fileName, receivedPath);
bWrite.Close();
clientSock.Close();
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("File Sending fail." + ex.Message);
}
}
}
}
خوب این برنامه نویسی سوکت سمت کلاینت هست. تو این برنامه سوکت کلاینت کارش اینه که وصل شه به سرور و ببینه آیا چیزی برای دریافت هست یا نه، و اگر بود دریافت کنه و به صورت مناسب نمایش بده.:چشمک:
کد همیشه واضحه و برای یک برنامه نویس C# توضیحی لارم نداره ولی من با این حال باید به چند نکته اشاره کنم:
1. سوکت ها دو نوع دارند: Packet Based OR Stream Based
2. دو خانواده دارند: Windows / Linux
3. دو پروتکل استفاده میکنند: TCP/IP OR UDP
اینها همون آرگومان های متد سازنده سوکت هستند. توصیه میشود مانند کد استفاده کنید :لبخند:
خوب دیگه بقیش واضحه سوکت با متد Connect وصل میشه، یا متد Receive دریافت میکنه و با Close هم بسته میشه! آسونه، مگه نه؟ اگر هنوز هم نمیفهمید پیشنهاد میکنم به کتابی که در آینده اتچ میکنم مراجعه کنید، (اگر به ادامه بحث علاقه مندید از دکمه تشکر استفاده کنید) وقتی از ماهیت سوکت ها سر در آوردید یه نگاه دوباره به این کد بندازید همه چیز روشن میشه!
خوب حالا سمت سرور:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace beginSocketServer
{
//FILE TRANSFER USING C#.NET SOCKET - SERVER
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("That program can transfer small file. I've test up to 850kb file");
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 5656);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
sock.Bind(ipEnd);
sock.Listen(100);
//clientSock is the socket object of client, so we can use it now to transfer data to client
Socket clientSock = sock.Accept();
string fileName = "test.txt";// "Your File Name";
string filePath = @"C:\FT\";//Your File Path;
byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName);
byte[] fileData = File.ReadAllBytes(filePath + fileName);
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);
clientSock.Send(clientData);
Console.WriteLine("File:{0} has been sent.", fileName);
clientSock.Close();
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("File Receiving fail." + ex.Message);
}
}
}
}
خوب میبینید که موضوع یکم پیچیده تر شد ولی نگران نباشید اگه دقت کنید میبینید که فقط یک سوکت اضافه شده و 4 متد جدید، همین! که اونا رو هم اگه دوستان پیگیری کنند تو پست های آینده توضیح میدم.
خواهشا پست اضافه یا آف نگذارید اگر به ادامه این بحث علاقه مندید فقط از دکمه تشکر استفاده کنید
دیدم تو فروم C# درباره سوکت ها بحث شده گفتم یه آموزش بزارم امیدوارم خوشتون بیاد (این دومیشه!)
خوب ببینید در یک جمله سوکت پروگرامینگ یعنی اینکه بیایم یک سری اطلاعات رو با یک سری شیء به نام سوکت از یک Device یه یک Device دیگه منتقل کنیم. حالا این Device هر چیزی میتونه باشه روبات یا کامپیوتر یا کنسول بازی!
تو این پروسه دو سیستم (یا همون Device) دخیلند: یکی سمتی که میفرسته (Client) و یکی هم سمتی که دریافت میکنه (server). خوب است بدانید که اینترنت هم خودش مجموعه بسیار عظیمی از سوکت های گوناگونه، و وقتی که شما مثلا وارد سایت برنامه نویس میشید به سورو حاوی این سایت یک درخواست میفرستید که این درخواست ها یه صورت یک سری بسته های اطلاعات رد و بدل میشند. پس شما میشید هون کلاینت! سرور حاوی سایت بعد از اینکه درخواست شما رو دریافت کرد اون رو پردازش میکنه و پاسخ مناسبی به شما میده مثلا صفحه ی اول سایت برنامه نویس!
خوب میبینید که هر طرف کار متفاوتی انجام میده پس Socket Programming سرور با کلاینت فرق داره که من در این آموزش هر دو را با سورس کد آموزش میدم. باور کنید کد رو که نگاه کنید همه چیز براتون واضح میشه مخصوصا اگر قبلا تو cmd با پینگ، پروتوکل ها و... سروکار داشتید. کسانی هم که با برنامه نویسی سریال آشنایی دارند هم سوکت پروگرامینگ رو بسیار آسون یاذ میگیرند.
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace Client_Socket
{
//FILE TRANSFER USING C#.NET SOCKET - CLIENT
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("That program can transfer small file. I've test up to 850kb file");
IPAddress[] ipAddress = Dns.GetHostAddresses("localhost");
IPEndPoint ipEnd = new IPEndPoint(ipAddress[0], 5656);
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
clientSock.Connect(ipEnd);
byte[] clientData = new byte[1024 * 5000];
string receivedPath = "C:/";
int receivedBytesLen = clientSock.Receive(clientData);
int fileNameLen = BitConverter.ToInt32(clientData, 0);
string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
Console.WriteLine("Client:{0} connected & File {1} started received.", clientSock.RemoteEndPoint, fileName);
BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + fileName, FileMode.Append)); ;
bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
Console.WriteLine("File: {0} received & saved at path: {1}", fileName, receivedPath);
bWrite.Close();
clientSock.Close();
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("File Sending fail." + ex.Message);
}
}
}
}
خوب این برنامه نویسی سوکت سمت کلاینت هست. تو این برنامه سوکت کلاینت کارش اینه که وصل شه به سرور و ببینه آیا چیزی برای دریافت هست یا نه، و اگر بود دریافت کنه و به صورت مناسب نمایش بده.:چشمک:
کد همیشه واضحه و برای یک برنامه نویس C# توضیحی لارم نداره ولی من با این حال باید به چند نکته اشاره کنم:
1. سوکت ها دو نوع دارند: Packet Based OR Stream Based
2. دو خانواده دارند: Windows / Linux
3. دو پروتکل استفاده میکنند: TCP/IP OR UDP
اینها همون آرگومان های متد سازنده سوکت هستند. توصیه میشود مانند کد استفاده کنید :لبخند:
خوب دیگه بقیش واضحه سوکت با متد Connect وصل میشه، یا متد Receive دریافت میکنه و با Close هم بسته میشه! آسونه، مگه نه؟ اگر هنوز هم نمیفهمید پیشنهاد میکنم به کتابی که در آینده اتچ میکنم مراجعه کنید، (اگر به ادامه بحث علاقه مندید از دکمه تشکر استفاده کنید) وقتی از ماهیت سوکت ها سر در آوردید یه نگاه دوباره به این کد بندازید همه چیز روشن میشه!
خوب حالا سمت سرور:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace beginSocketServer
{
//FILE TRANSFER USING C#.NET SOCKET - SERVER
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("That program can transfer small file. I've test up to 850kb file");
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 5656);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
sock.Bind(ipEnd);
sock.Listen(100);
//clientSock is the socket object of client, so we can use it now to transfer data to client
Socket clientSock = sock.Accept();
string fileName = "test.txt";// "Your File Name";
string filePath = @"C:\FT\";//Your File Path;
byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName);
byte[] fileData = File.ReadAllBytes(filePath + fileName);
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);
clientSock.Send(clientData);
Console.WriteLine("File:{0} has been sent.", fileName);
clientSock.Close();
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("File Receiving fail." + ex.Message);
}
}
}
}
خوب میبینید که موضوع یکم پیچیده تر شد ولی نگران نباشید اگه دقت کنید میبینید که فقط یک سوکت اضافه شده و 4 متد جدید، همین! که اونا رو هم اگه دوستان پیگیری کنند تو پست های آینده توضیح میدم.
خواهشا پست اضافه یا آف نگذارید اگر به ادامه این بحث علاقه مندید فقط از دکمه تشکر استفاده کنید