آموزش دروس سوم دبیرستان  و کنکور +المپیاد
آموزش دروس سوم دبیرستان  و کنکور +المپیاد

آموزش دروس سوم دبیرستان و کنکور +المپیاد

تیزهوشان بوشهر.....

آموزش سوکت نویسی


برای مشاهده به ادامه مطلب بروید.

استفاده از کنترل Winsockکنترل Winsock به شما این قابلیت را می دهد که به یک کامپیوتر از راه دور متصل شوید و به تبادل اطلاعات به وسیله پروتکل UDP و یاTCP (پروتکل کنترل تبادلات) بپردازید. از هردو پروتکل می توان برای ساخت برنامه های Client-Server استفاده کرد. همانند کنترل Timer، کنترل WinSock در زمان اجرا دیده نمی شود.

موارد استفاده
- ساخت یک برنامه سرویس گیرنده که اطلاعات کاربر را قبل از ارسال به سرور مرکزی جمع آوری می کند.
- ساخت یک برنامه سرویس دهنده که مانند یک نقطه مرکزی جمع آوری اطلاعات از کاربرها عمل می کند.
- ساخت یک برنامه برای Chat کردن.

انتخاب یک پروتکل
هنگام استفاده از کنترل WinSock ، اولین نکته ای که باید در نظر بگیرید این است که از کدام پروتکل می خواهید استفاده کنید UDP یا TCP. تفاوت مهم میان این دو در چگونگی اتصال آنهاست :
- پروتکل کنترلی TCP یک پروتکل برپایه اتصال (Connection-Based)، و مشابه تلفن است (کاربر باید یک اتصال را قبل از پردازش برقرار کند).
- پروتکل UDP یک پروتکل بدون اتصال (اتصال قطع) می باشد، و تبادلات میان دو کامپیوتر همانند ارسال یک پیغام که از یک کامپیوتر به دیگری ارسال شده باشد می باشد، اما هیچ اتصال آشکاری میان آن دو نیست. با این وجود، حداکثر اندازه اطلاعاتی که به صورت یکجا ارسال می شود بستگی به شبکه دارد.

نوع برنامه ای که شما در حال ساخت آن هستید بستگی به پروتکلی دارد که انتخاب کرده اید. در اینجا تعدادی سوال مطرح است که با پاسخ گویی به آنها می توانید پروتکل مورد نیاز برنامه خودتان را انتخاب کنید :
- آیا برنامه هنگام ارسال یا دریافت اطلاعات، نیاز به تأییدیه از سرور یا کلاینت دارد؟ در صورت مثبت بودن پاسخ، پروتکل TCP یک اتصال آشکارا قبل از ارسال یا دریافت داده ها لازم دارد.
- حجم اطلاعات شما خیلی زیاد است (مثل فایل های تصویر ویا صوتی)؟ زمانیکه اتصال برقرار شد، پروتکل TCP اطمینان از تداوم اتصال و صحت اطلاعات را تظمین می کند. اگرچه این اتصال بدلیل استفاده از منابع محاسباتی بیشتر، هزینه ارسال را بیشتر می کند.
- آیا می خواهید اطلاعات را به صورت ترتیبی ارسال کنید یا به صورت جمعی و یکجا؟ برای مثال، اگر شما در حال ساخت برنامه ای هستید که هنگامی که یک پردازش ویژه به پایان رسید، به کامپیوترهایی خاص اطلاع دهد، پروتکل UDP مناسب تر است. همچنین پروتکل UDP  برای ارسال مقادیر کوچک اطلاعات مناسب تر است.

 
تنظیم کردن پروتکل
برای تنظیم کردن پروتکلی که برنامه شما می خواهد استفاده کند: در محیط طراحی، در پنجره Properties، روی خاصیت Protocol کلیک کنید و یکی از گزینه های sckTCPProtocol یا sckUDPProtocol را انتخاب کنید. همچنین شما می توانید خاصیت Protocol را بوسیله کد نیز تنظیم کنید، به کد زیر توجه کنید:

Winsock1.Protocol = sckTCPProtocol

تشخیص نام کامپیوتر خودتان
برای اتصال به یک کامپیوتر از راه دور، شما باید یا آدرس IP و یا نام آن کامپیوتر را بدانید. آدرس IP یک مجموعه از اعداد سه رقمی است که به وسیله نقطه از یکدیگر جدا شده اند (xxx.xxx.xxx.xxx). درکل، راه آسانتر آن است که نام کامپیوتر را به خاطر بسپارید.

جهت پیدا کردن نام کامپیوتر خودتان
1- در Taskbar روی منوی Start کلیک کنید.
2- روی گزینه Control Panel کلیک کنید.
3- روی آیکون Network کلیک کنید.
4- از پنجره باز شده وارد تب Identification شوید.
5- در قسمت Computer Name می توانید نام کامپیوتر خودتان را پیدا کنید.
زمانیکه نام کامپیوتر خود را یافتید، می توانید آنرا برای مقدار خاصیت RemoteHost استفاده کنید.
مقدمات اتصال TCP
هنگامی که برنامه ای را می سازید که از پروتکل TCP استفاده می کند، شما باید ابتدا تصمیم بگیرید که برنامه شما یک برنامه سرویس دهنده است یا سرویس گیرنده. ساخت یک سرویس دهنده به این معناست که برنامه شما باید به پورتی که مشخص کرده اید «گوش بدهد». هنگامی که سرویس گیرنده تقاضای یک اتصال را می دهد، سرویس دهنده می تواند تقاضا را تأیید کرده و به وسیله آن یک اتصال کامل را برقرار کند. زمانیکه اتصال کامل شد، سرویس دهنده و سرویس گیرنده می توانند به طور آزادانه به یکدیگر مخابره کنند.
طی مراحل زیر یک سرویس دهنده اولیه می سازیم:

برای ساخت یک سرویس دهنده TCP :
1- یک پروژه Standard EXE جدید بسازید.
2- نام فرم اصلی به frmServer تغییر بدهید
3- خاصیت Caption فرم را به TCP Server تغییر دهید
4- یک کنترل WinSock بر روی فرم قرار دهید و نام آنرا به tcpServer تغییر دهید.
5- دو عدد TextBox روی فرم قرار دهید. نام اولی را به txtSendData و دیگری را به txtOutput تغییر دهید.
6- کد زیر را به فرم خود اضافه کنید.

Private Sub Form_Load() 
    ' Set the LocalPort property to an integer. 
    ' Then invoke the Listen method. 
    tcpServer.LocalPort = 1001 
    tcpServer.Listen  
    frmClient.Show  ' Show the client form. 
End Sub

Private Sub tcpServer_ConnectionRequest (ByVal requestID As Long) 
    ' Check if the control's State is closed. If not,  
    ' close the connection before accepting the new 
    ' connection. 
    If tcpServer.State <> sckClosed Then tcpServer.Close 
    ' Accept the request with the requestID parameter. 
    tcpServer.Accept requestID 
End Sub

Private Sub txtSendData_Change() 
    ' The TextBox control named txtSendData  
    ' contains the data to be sent. Whenever the user  
    ' types into the  textbox, the  string is sent  
    ' using the SendData method. 
    tcpServer.SendData txtSendData.Text 
End Sub

Private Sub tcpServer_DataArrival (ByVal bytesTotal As Long) 
    ' Declare a variable for the incoming data.  
    ' Invoke the GetData method and set the Text 
    ' property of a TextBox named txtOutput to  the data. 
    Dim strData As String 
    tcpServer.GetData strData 
    txtOutput.Text = strData 
End Sub

رویدادهای بالا یک برنامه سرور ساده می سازند. اگرچه برای تکمیل پروژه، شما باید یک برنامه سرویس گیرنده بسازید.

برای ساخت یک سرویس گیرنده TCP
1- یک فرم جدید به پروژه خود اضافه کنید و نام آنرا به frmClient تغییر دهید.
2- خاصیت Caption آن فرم را به TCP Client تغییر دهید.
3- یک کنترل WinSock به فرم اضافه کنید و نام آنرا به tcpClient تغییر دهید.
4- دو عدد کنترل TextBox به فرم frmClient اضافه کنید. نام اولی را به txtSend و دومی را به txtOutput تغییر دهید.
5- یک دکمه روی فرم قرار دهید و نام آنرا به cmdConnect تغییر دهید.
6- خاصیت Caption دکمه را به Connect تغییر دهید.
7- کد زیر را در ناحیه کد فرم وارد کنید:

توجه :
مطمئن شوید که مقدار خاصیت RemoteHost کنترل WinSock را برابر نام کامپیوتر     (Computer Name) خودتان تنظیم کرده اید.

Private Sub Form_Load()
     ' The name of the Winsock control is tcpClient.
     ' Note: to specify a remote host, you can use
     ' either the IP address (ex: "121.111.1.1") or
     ' the computer's "friendly" name, as shown here.
     tcpClient.RemoteHost = "RemoteComputerName"
     tcpClient.RemotePort = 1001 
End Sub  
Private Sub cmdConnect_Click()
     'Invoke the Connect method to initiate a connection.
     tcpClient.Connect 
End Sub
Private Sub txtSend_Change()
     tcpClient.SendData txtSend.Text
End Sub
Private Sub tcpClient_DataArrival (ByVal bytesTotal As Long)
     Dim strData As String
     tcpClient.GetData strData
     txtOutput.Text = strData 
End Sub

کد بالا یک برنامه سرویس دهنده-سرویس گیرنده ساده درست می کند. برای تست کردن هر دو فرم، پروژه را اجرا کنید و دکمه Connect را کلیک کنید. سپس متنی را در txtSendDataی هریک از دو فرم تایپ کنید، و متن مشابهی در txtOutput روی فرم دیگر نمایش داده می شود.

اتصال چند سرویس گیرنده به یک سرویس دهنده
در قسمت قبل، سرویس دهنده ما فقط به یک تقاضای اتصال پاسخ می داد. اگرچه، شما می توانید چندین تقاضای اتصال را بوسیله ساختن یک آرایه از کنترل WinSock (Control Array) قبول کنید. در این صورت، دیگر نیازی به قطع اتصال ندارید، بلکه به آسانی می توانید یک نمونه از کنترل را (با تنظیم خاصیت Index) ایجاد کنید، و درخواست اتصال را با عنصر جدید تأیید کنید.
در کد زیر فرض شده که یک کنترل WinSock بر روی فرم قرار داده شده و آنرا sckServer نامیده اید، خاصیت Index آنرا به 0 (صفر) تغییر داده اید. بنابراین این کنترل یک عنصر از آرایه کنترل های WinSock می شود. در قسمت Declarations، یک متغیر محلی به نام intMax تعریف شده. در رویداد Load فرم، intMax برابر صفر قرار داده شده و خاصیت LocalPort اولین کنترل WinSockی که به صورت آرایه در آمده را برابر 1001 قرار می دهیم و متد Listen آنرا «گوش کردن کنترل به پورت» اجرا می کنیم. هنگامی که یک تقاضای اتصال به برنامه ما می رسد، ابتدا چک می کند که خاصیت Index برابر صفر است یا خیر (اندیس آخرین کنترلی که در حال گوش کردن به پورت است). در صورت درستی، برنامه یک واحد به intMax اضافه می کند و از عدد حاصل جهت ایجاد یک عنصر دیگر به آرایه کنترل های WinSock استفاده می کند. سپس از عنصر جدید جهت تأیید تقاضای اتصال استفاده می شود.


Private intMax As Long
Private Sub Form_Load()
    intMax = 0
    sckServer(0).LocalPort = 1001
    sckServer(0).Listen 
End Sub  
Private Sub sckServer_ConnectionRequest (Index As Integer, ByVal requestID As Long)
    If Index = 0 Then
       intMax = intMax + 1
       Load sckServer(intMax)
       sckServer(intMax).LocalPort = 0
       sckServer(intMax).Accept requested
       Load txtData(intMax)    
    End If 
End Sub
 

مقدمه ای بر UDP
ساخت یک برنامه UDP بسیار آسانتر از ساخت یک برنامه TCP است زیرا پروتکل UDP نیازی به اتصال آشکارا ندارد. در برنامه بالا، یک کنترل WinSock می بایست به طور آشکارا به پورت گوش می کرد تا زمانیکه کامپیوتر دیگر اقدام به تقاضای اتصال به وسیله متد Connect نماید.
در مقابل، پروتکل UPD نیازی به اتصال آشکار ندارد. برای ارسال داده ها بین دو کنترل، سه مرحله باید طی شود (در هردو طرف اتصال):
1- تنظیم خاصیت RemoteHost برابر نام کامپیوتر دیگر.
2- تنظیم خاصیت RemotePort برابر خاصیت LocalPort کامپیوتر دیگر.
3- اجرای متد Bind جهت تعریف خاصیت LocalPortی که میبایست استفاده شود. (اطلاعات بیشتری در رابطه با متد Bind در آخر مقاله داده شده)

بدلیل اینکه هر دو کامپیوتر می توانند در رابطه ها نقش مساوی داشته باشند، می توان آنرا یک برنامه Peer-to-Peer یا همان نظیر به نظیر نامید. برای نمونه، برنامه زیر یک برنامه گفتگو (Chat) ایجاد می کند که به دو شخص این امکان را می دهد که با یکدیگر در یک لحظه و از طریق کامپیوترهایشان گفتگو کنند.

 
برای ساخت یک همتای UDP
1- یک پروژه Standard EXE جدید بسازید.
2- نام فرم اصلی را به frmPeerA تغییر دهید.
3- خاصیت Caption فرم را به Peer A تغییر دهید.
4- یک کنترل WinSock روی فرم قرار داده و نام آنرا به udpPeerA تغییر دهید.
5- در پنجره Properties، روی گزینه Protocol کلیک کنید و آنرا به UDPProtocol تغییر دهید.
6- دو عدد کنترل Textbox روی فرم قرار دهید. نام اولی را به txtSend و دومی را به txtOutput  تغییر دهید.
7- کد زیر را در ناحیه کد فرم قرار دهید:

Private Sub Form_Load() 
    ' The control's name is udpPeerA 
    With udpPeerA 
        ' IMPORTANT: be sure to change the RemoteHost  
        ' value to the name of your computer. 
        .RemoteHost= "PeerB"  
        .RemotePort = 1001   ' Port to connect to. 
        .Bind 1002                ' Bind to the local port. 
    End With 
    frmPeerB.Show                 ' Show the second form. 
End Sub 
 Private Sub txtSend_Change() 
    ' Send text as soon as it's typed. 
    udpPeerA.SendData txtSend.Text 
End Sub 
 
Private Sub udpPeerA_DataArrival (ByVal bytesTotal As Long) 
    Dim strData As String 
    udpPeerA.GetData strData 
    txtOutput.Text = strData 
End Sub

برای ساخت همتای UDP دوم
1- یک فرم استاندارد جدید به پروژه اضافه کنید.
2- نام آنرا به frmPeerB تغییر دهید.
3- خاصیت Caption فرم را به Peer B تغییر دهید.
4- یک عدد کنترل WinSock روی فرم قرار داده و نام آنرا به udpPeerB تغییر دهید.
5- در پنجره Properties، روی گزینه Protocol کلیک کنید و آنرا به UDPProtocol تغییر دهید.
6- دو عدد کنترل TextBox روی فرم قرار دهید. نام اولی را به txtSend و دومی را به txtOutput تغییر دهید.
7- کد زیر را در ناحیه کد فرم قرار دهید.

 

Private Sub Form_Load() 
   ' The control's name is udpPeerB. 
    With udpPeerB 
        ' IMPORTANT: be sure to change the RemoteHost  
        ' value to the name of your computer. 
        .RemoteHost= "PeerA" 
        .RemotePort = 1002    ' Port to connect to. 
        .Bind 1001                ' Bind to the local port. 
    End With
End Sub 
 
Private Sub txtSend_Change() 
    ' Send text as soon as it's typed. 
    udpPeerB.SendData txtSend.Text 
End Sub 
 
Private Sub udpPeerB_DataArrival (ByVal bytesTotal As Long) 
    Dim strData As String 
    udpPeerB.GetData strData 
    txtOutput.Text = strData 
End Sub

برنامه را آزمایش کنید، کلید F5 را برای اجرای پروژه فشار دهید، متنی را در txtSend هریک از فرم ها تایپ کنید. متنی که شما تایپ کرده اید در txtOutput فرم دیگر نمایش داده می شود.

 
درباره متد Bind
همانطور که در کد بالا دیده شد، هنگامی که یک پروژه UDP را می سازید، باید متد Bind را صدا بزنید. متد Bind یک پورت از کامپیوتر شما را برای استفاده توسط کنترل WinSock، رزرو می کند. برای مثال، هنگامی که شما پورت 1001 را به کنترل اختصاص می دهید، هیچ برنامه دیگری نمی تواند از آن پورت برای گوش کردن استفاده کند. این روش ممکن است کاربردهای زیادی داشته باشد مخصوصاً هنگامی که می خواهید جلوی برنامه ای را بگیرید تا از آن پورت استفاده نکند.
متد Bind همچنین دو آرگومان اختیاری دارد، از آرگومان دوم هنگامی استفاده می شود که در یک کامپیوتر از دو کارت شبکه استفاده شده باشد. آرگومان LocalIP به شما این قابلیت را میدهد که مشخص کنید که از کدام کارت شبکه می خواهید استفاده کنید. اگر شما این آرگومان را از قلم بیاندازید، کنترل WinSock اولین کارت شبکه ای را که در لیست کارت های شبکه قرار دارد انتخاب می کند.
هنگامی که از پروتکل UDP استفاده می کنید، شما می توانید بطور آزادانه تا زمانی که از یک LocalPort  استفاده می کنید، خواص RemoteHost و RemotePort را عوض کنید. درصورتیکه در پروتکل TCP شما می بایست اتصال را قبل از تغییر خواص RemoteHost و RemotePort، قطع  می کردید.
 
منبع :
http://DrTJ.blogfa.com

نظرات 1 + ارسال نظر
fatshad جمعه 13 اردیبهشت‌ماه سال 1392 ساعت 05:49 ب.ظ

خوب بود اما برنامه ی فرستنده رو بعضی از visual basic ها نمی خونه

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد