نام پروژه
CHAT 1-1
CHAT 1-n
استاد راهنما
نام دانشجو
بسم الله الرحمن الرحیم
کار با کنترل winsock
کنترل winsock به شما اجازه می دهد به یک ماشین راه دور متصل شده و داده ها را با استفاده از پروتکل TCP و UDP مبادله کنید. هر دو پروتکل می توانند برای برنامه های client و server استفاده شوند.
موارد استفاده :
* ساختن یک برنامه client که اطلاعات کاربر را قبل از فرستادن به سمت server جمع آوری می کند.
* ساختن بک برنامه server که به عنوان بک نقطه مرکزی مجموعه برای داده های چندین کاربر می باشد.
* ساخت یک برنامه chat
* و موارد دیگر …
Socket :
عاملی است برای برنامه نویسی تحت اینترنت که از طریق آن دو برنامه ، دو پروسه در شبکه مشخص می شوند .بنابراین اطلاعات ارسال شده یا دریافت شده از طریق این شماره منحصر به فرد یا عامل منحصر به فرد مسیر خود را پیدا می کند.
انتخاب یک پروتکل :
وقتی از کنترل winsock استفاده می کنید باید به این مسئله رسیدگی کنید که کدامیک از پروتکل های TCP و UDP را می خواهید استفاده کنید . تفاوت اصلی بین این دو در حالت اتصال آنها می باشد :
* پروتکل TCP یک پروتکل اتصال – پایه است و مانند تلفن کاربر باید قبل از اقدام به ارسال اطلاعات یک ارتباط ایجاد کند.
* پروتکل UDP یک پروتکل بدون اتصال است و مبادله اطلاعات بین دو کامپیوتر مانند ارسال پیغام است : یک پیغام از یک کامپیوتر برای یکی دیگر ارسال می شود اما ارتباط بین آن دو واضح نیست . حداکثر اندازه داده ارسال شده به صورت منحصر به فرد ، بوسیله شبکه تعیین می شود .
ساخت یک client :
وظیفه برنامه client side application : فرایند یا برنامه ای که در سمت مشتری برای استفاده از یک سرویس وب اجرا می شود .
عملیاتی که توسط client side application انجام می شود:
* در خواست اتصال به برنامه server (عمل connect )
* عمل ارسال اطلاعات به سمت server
* دریافت اطلاعات از server
1- برای شروع سا خت برنامه client ابتدا ویژوال بیسیک را باز کرده و یک پروژه استاندارد را انتخاب و سپس آنرا باز می کنیم
2- سپس در قسمت ابزار راست کلیک کرده و گزینه components… را انتخاب می کنیم .
3- از صفحه ای که باز می شود گزینه Microsoft WinSock Control 6 را انتخاب می کنیم
4- بعد از زدن دکمه ok دو کامپیوتر کوچک پشت سرهم در کنار نوار ابزار پدیدار می شوند .
5- سپس روی آن کلیک کرده و آنرا برروری فرم خود قرار دهید . نام آنرا به sockc تغییر دهید .
Winsock یکی از ابزارهای برقراری ارتباط از طریق پورتهای TCP و UDP بین server و client در ویژوال بیسیک می باشد . تقریبا تمام ارتباطات استاندارد در ویژوال بیسیک از این طریق انجام می گیرد .
6- بعد از انجام مراحل بالا 5 Textbox به فرم مورد نظر خود اضافه می کنیم
سپس بر روی فرم مورد نظر خود دو بار راست کلیک می کنیم تا وارد محیط کد نویسی شویم . سپس در form_load( ) برنامه خود کدهای زیر را اضافه می کنیم .
Private Sub cmdConnect_Click()
If sockc.state = 0 Then
sockc.RemoteHost = txtip.Text
sockc.RemotePort = txtport.Text
sockc.Connect
Label3.Caption = status(sockc.state)
txtsend.SetFocus
Else
sockc.Close
Label3.Caption = status(sockc.state)
End If
Label3.Caption = status(sockc.state)
End Sub
تنظیم پروتکل :
برای تنظیم پروتکل شما می توانید از یکی از دو حالت sckTCPProtocol و sckUDPProtocol استفاده کنید که ما در اینجا از خاصیت sckTCPProtocol استفاده کرده ایم .
مشخص کردن نام کامپیوتر :
برای اتصال به کامپیوتر راه دور شما باید IP ویا نام دوستانه آنرا بدانید. IP کامپیوترهای شخصی 127.0.0.1 می باشد که این رشته را به عنوان مقدار برای خاصیت RemoteHost قرار می دهیم .
مشخص کردن پورت کامپیوتر ها :
برای اینکه کامپیوتر های راه دور بتوانند با یکدیگر ارتباط برقرار کنند بایستی یک شماره پورت برای نرم افزارهای دو طرف یعنی client و server انتخاب می کنیم که در واقع نرم افزارها از طریق این پورت با یکدیگر ارتباط برقرار می کنند .و این پورت به عنوان ورودیها و خروجیهای دو نرم افزار عمل می کند که ما در اینجا مقدار خاصیت RemotePort را برابر رشته 5050 قرار داده ایم .
سپس مقدار دو socks.protocolو socks.local port را به ترتیب برابر با 127.0.0.1 و 5050 قرار داده ایم که وقتی برنامه client اجرا می شود برای کاربر مشخص شود که برنامه بر روی چه IP و پورتی کار می کند .
بعد از این کار مقدار را برابر مقداری که یک تابع بر می گرداند قرار داده ایم . کار این تایع به این صورت است که در هر لحظه وضعیت برنامه client را مشخص می کند در واقع sockc.state داخل پرانتز یک عدد را برمی گرداند .
تعریف تابع status :
unction status(state As Integer)
Select Case state
Case 0
status = "closed"
Case 1
status = "open"
Case 2
status = "listening…"
Case 6
status = "connecting…"
Case 7
status = "connected"
Case 9
status = "ERROR"
End Select
End Function
در اینجا برای انتخابهای 0 تا 9 مقدار status را با یک پیغام مناسب مقدار دهی کرده ایم .
کد برنامه
Chat 1-Chat 1
———————————-
Client
———————————-
Option Explicit
Private Sub cmdClose_Click()
sockc.Close
End Sub
Private Sub cmdConnect_Click()
If sockc.state = 0 Then
sockc.RemoteHost = txtip.Text
sockc.RemotePort = txtport.Text
sockc.Connect
Label3.Caption = status(sockc.state)
txtsend.SetFocus
Else
sockc.Close
Label3.Caption = status(sockc.state)
End If
Label3.Caption = status(sockc.state)
End Sub
Private Sub cmdSend_Click()
If sockc.state = sckConnected Then
sockc.SendData txtsend.Text
Label3.Caption = "Sending Data"
Else
Label3.Caption = "Not connected to host"
End If
End Sub
Private Sub sockc_DataArrival(ByVal bytesTotal As Long)
Dim sData As String
sockc.GetData sData,vbString
txtget.Text = sData
Label3.Caption = "Received Data"
End Sub
Private Sub sockc_SendComplete()
Label3.Caption = "Data Send"
End Sub
Function status(state As Integer)
Select Case state
Case 0
status = "closed"
Case 1
status = "open"
Case 2
status = "listening…"
Case 6
status = "connecting…"
Case 7
status = "connected"
Case 9
status = "ERROR"
End Select
End Function
Server
————————————-
Function Status (State As Integer)
Select Case state
Case 0
status = "closed"
Case 1
status = "open"
Case 2
status = "listening…"
Case 6
status = "connecting…"
Case 7
status = "connected"
Case 9
status = "ERROR"
End Select
End Function
Private Sub Form_Load()
socks.Protocol = sckTCPProtocol
socks.LocalPort = 5050
socks.listen
lblhost.Caption = socks.LocalHostName
lblip.Caption = socks.LocalIP
lblstatus.Caption = status(socks.state)
End Sub
Private Sub listen_Click()
If socks.state = sckClose Then
socks.listen
Else
socks.Close
End If
lblstatus.Caption = status(socks.state)
End Sub
Private Sub Send_Click()
If socks.state = sckConnected Then
socks.SendData sendtxt.Text
Else
MsgBox "Not Connected To Server Please Check Again", vbExclamation, " ALERT"
End If
lblstatus.Caption = status(socks.state)
End Sub
Private Sub socks_Close()
socks.Close
socks.listen
lblstatus.Caption = status(socks.state)
End Sub
Private Sub socks_ConnectionRequest(ByVal request ID As Long)
socks.Close
socks.Accept request ID
lblstatus.Caption = status(socks.state)
End Sub
Private Sub socks_DataArrival(ByVal bytesTotal As Long)
Dim data As String
socks.GetData data
gettxt.Text = data
lblstatus.Caption = status(socks.state)
End Sub
Chat 1-Chat n
———————————–
client
———————————–
Private Sub Command1_Click()
If Winsock1.State = sckClosed Then
Winsock1.Connect
Else
Winsock1.Close
End If
End Sub
Private Sub Command2_Click()
If Winsock1.State = sckConnected Then
Winsock1.SendData Text1.Text
Else
MsgBox ("connection does not valid")
End If
End Sub
Private Sub Form_Load()
Winsock1.RemoteHost = "localhost"
Winsock1.RemotePort = 1001
End Sub
Private Sub Winsock1_Close()
Winsock1.Close
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strdata As String
Winsock1.GetData strdata
Text2.Text = strdata
End Sub
Private Sub Winsock1_Error(ByVal Number As Integer,Description As String, ByVal
Scode As Long,ByVal Source As String,ByVal HelpFile As String,ByVal HelpContext As Long,CancelDisplay As Boolean)
MsgBox "socket on ( " & Form1.Caption & " )ERROR : " & Description
Winsock1.Close
End Sub
Server
———————————–
Private intmax As Long
Private Sub Command1_Click()
Winsock1(Val(Text3.Text)).SendData Text1.Text
End Sub
Private Sub Form_Load()
intmax = 0
Winsock1(0).LocalPort = 1001
Winsock1(0).Listen
End Sub
Private Sub Winsock1_Close(Index As Integer)
Unload Winsock1(Index)
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer,ByVal request ID As Long)
If Index = 0 Then
intmax = intmax + 1
Load Winsock1(intmax)
Winsock1(intmax).LocalPort = 0
Winsock1(intmax).Accept request ID
Load Text2(intmax)
End If
End Sub
Private Sub Winsock1_DataArrival(Index As Integer,ByVal bytesTotal As Long)
Dim strdata As String
Winsock1(Index).GetData strdata
Text2(Index).Text = strdata
List1.AddItem Text2(Index).Text & "–>" & Str(Index)
Text3.Text = Index
End Sub
درارتباط با پروژه
توضیحات کد برنامه:
Client
———————————-
Option Explicit
Private Sub cmdClose_Click()
sockc.Close
End Sub
این تابع برای این است که تمام client ها را ببندد وبعد ادامه کاررا انجام دهد.
Private Sub cmdConnect_Click()
If sockc.state = 0 Then
sockc.RemoteHost = txtip.Text
sockc.RemotePort = txtport.Text
sockc.Connect
Label3.Caption = status(sockc.state)
txtsend.SetFocus
Else
sockc.Close
Label3.Caption = status(sockc.state)
End If
Label3.Caption = status(sockc.state)
End Sub
در اینجا وضعیت client را بررسی می کندکه آیا از قبل connect هست یا نه.اگرconnect باشدآنرا می بندد( closed ).
از sockc.RemoteHost = txtip.Text sockc.RemotePort = txtport.Text برای شناسایی port و نمایش آدرس شخص فرستنده به صورت رشته استفاده می شود.
بعد connect می شود.
txtsend.SetFocus در واقع ایجاد یک ناظر بین client و server می باشد که نظاره گر آن ها می باشدومراقب ارسال و دریافت داده ها است.
در غیراینصورت client را می بندد.
Private Sub cmdSend_Click()
If sockc.state = sckConnected Then
sockc.SendData txtsend.Text
Label3.Caption = "Sending Data"
Else
Label3.Caption = "Not connected to host"
End If
End Sub
بررسی می کند که آیا وصل( connected ) هست یا نه.
اگروصل بود داده را به صورت متن ارسال می کند وبرچسب sending data نمایان می شود.
در غیراینصورت برچسب Not connected to host ظاهر می گردد.
Private Sub sockc_DataArrival(ByVal bytesTotal As Long)
Dim sData As String
sockc.GetData sData,vbString
txtget.Text = sData
Label3.Caption = "Received Data"
End Sub
این تابع برای تعریف متغیرها استفاده می شود.
درآن آرایه ای با نام sData تعریف شده و خروجی آن رشته می باشد.
وجهت مرتبط ساختن به sockc از GetData استفاده می کند.در اینجا دو متغیر sData,vbString داریم.
خروجی آن از نوع متن می باشد.
وهنگامی که داده را دریافت می کند برچسب Received Data نمایان می شود.
Private Sub sockc_SendComplete()
Label3.Caption = "Data Send"
End Sub
این تابع برای ارسال است.هنگامی که داده فرستاده می شود برچسب Data Send نمایان می شود.
Function status(state As Integer)
Select Case state
Case 0
status = "closed"
Case 1
status = "open"
Case 2
status = "listening…"
Case 6
status = "connecting…"
Case 7
status = "connected"
Case 9
status = "ERROR"
End Select
End Function
این تابع جهت بررسی وضعیت می باشد.
اگر 0 بود آن را می بندد
اگر 1 بود آن را باز می کند
اگر 2 بود وقفه ایجاد می کند……وبه همین ترتیب تا آخر.
Server
————————————
Function Status (State As Integer)
Select Case state
Case 0
status = "closed"
Case 1
status = "open"
Case 2
status = "listening…"
Case 6
status = "connecting…"
Case 7
status = "connected"
Case 9
status = "ERROR"
End Select
End Function
همانطور که گفته شد این تابع بررسی وضعیت می باشد.
Private Sub Form_Load()
socks.Protocol = sckTCPProtocol
socks.LocalPort = 5050
socks.listen
lblhost.Caption = socks.LocalHostName
lblip.Caption = socks.LocalIP
lblstatus.Caption = status(socks.state)
End Sub
می دانیم که دو نوع پروتکل وجود دارد. UDP و TCP IP .
که در UDP نیازی به اتصال نمی باشدولی در TCPIP می بایست حتما ارتباط یا عدم ارتباط بررسی شود.
دراین برنامه از پروتکلTCP IP استفاده می شود.
lblhost.Caption = socks.LocalHostName برای شناسایی شخص میزبان (که در server قراردارد ) به کار می رود.
lblip.Caption = socks.LocalIP مکان آدرس IP را پیدا می کند. lblstatus.Caption = status(socks.state) وضعیت socket را نشان می دهد که آیا فعال هست یا خیر.
Private Sub listen_Click()
If socks.state = sckClose Then
socks.listen
Else
socks.Close
End If
lblstatus.Caption = status(socks.state)
End Sub
این شرط وضعیت client را چک می کند.
اگر close باشد یک وقفه ایجاد می کند.
در غیراینصورت همان ابتدا تمام clientهارا close می کند.
lblstatus.Caption = status(socks.state) هم وضعیت socket را نشان می دهد.
Private Sub Send_Click()
If socks.state = sckConnected Then
socks.SendData sendtxt.Text
Else
MsgBox "Not Connected To Server Please Check Again", vbExclamation, " ALERT"
End If
lblstatus.Caption = status(socks.state)
End Sub
این تابع در صورت متصل بودن portاجازه ارسال داده را می دهد
و داده را به صورت متن ارسال می کند.
در غیر اینصورت پیغام Not Connected To Server Please Check Again را مبنی بر این که ارتباط برقرار نیست نمایش می دهد.
Private Sub socks_Close()
socks.Close
socks.listen
lblstatus.Caption = status(socks.state)
End Sub
این تابعclientها را می بندد.
وقفه ای ایجاد می کند.
و وضعیت socket را نشان می دهد.
Private Sub socks_ConnectionRequest(ByVal request ID As Long)
socks.Close
socks.Accept request ID
lblstatus.Caption = status(socks.state)
End Sub
این تابع برای درخواست ارتباط است.
برای این کار باید تمامی clientها بسته شوند.
آدرسIP پذیرفته شود.
وضعیت socket بررسی شود.
Private Sub socks_DataArrival(ByVal bytesTotal As Long)
Dim data As String
socks.GetData data
gettxt.Text = data
lblstatus.Caption = status(socks.state)
End Sub
این تابع برای تعریف متغیرها استفاده می شود.
درآن آرایه ای با نام data تعریف شده و خروجی آن رشته می باشد.
وجهت مرتبط ساختن به socks از GetDataاستفاده می کند.
دریافت داده به صورت متن ازطریق gettxt.Text = data صورت می گیرد.
برای بررسی وضعیت پروتکل و تغییر روی آن نیزاز lblstatus.Caption = status(socks.state) استفاده می شود.
client
———————————–
Private Sub Command1_Click()
If Winsock1.State = sckClosed Then
Winsock1.Connect
Else
Winsock1.Close
End If
End Sub
شرط جهت چک کردن وضعیت client می باشد.
اگرازقبل clientی بازباشد همه آنها رامی بندد و متصل(connect) می شود
درغیراینصورت همان ابتداتمام client هارامی بندد.
Private Sub Command2_Click()
If Winsock1.State = sckConnected Then
Winsock1.SendData Text1.Text
Else
MsgBox ("connection does not valid")
End If
End Sub
شرط برای نمایش ارسال داده می باشد.
اگرارتباط برقرارباشد (connected) داده را به صورت متن به خروجی می فرستد
درغیراینصورت پیغام connection does not valid راچاپ می کند.
Private Sub Form_Load()
Winsock1.RemoteHost = "localhost"
Winsock1.RemotePort = 1001
End Sub
جهت فراهم کردن نمایش در صفحه می باشد.
نمایش مکان میزبان ودرصورت وجودآن پیغام localhost رانشان می دهد.
همچنین بااستفاده از پورت 1001 وضعیت میزبان را نمایش ویاچک می کند.
Private Sub Winsock1_Close()
Winsock1.Close
End Sub
بعدازاتمام کارهاحتما می بایست تابعی برای خاتمه کارها موجودباشدکه این تابع این کاررا انجام می دهد.( برای بستن تمامی پروتکل ها هم ازاین تابع استفاده می شود.)
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strdata As String
Winsock1.GetData strdata
Text2.Text = strdata
End Sub
این تابع برای تعریف متغیرها استفاده می شود.
درآن آرایه ای با نام strdata تعریف شده وخروجی آن رشته می باشد.
وجهت مرتبط ساختن به Winsock1 از GetDataاستفاده می کند.
وخروجی آن از نوع متن می باشدکه توسط Text2.Text = strdata مشخص شده است.
Private Sub Winsock1_Error(ByVal Number As Integer,Description As String, ByVal
Scode As Long,ByVal Source As String,ByVal HelpFile As String,ByVal HelpContext As Long,CancelDisplay As Boolean)
MsgBox "socket on ( " & Form1.Caption & " )ERROR : " & Description
Winsock1.Close
End Sub
برای مشخص کردن خطاهای احتمالی است.
که درصورت وصل نبودن یا connect نبودن پیغام های فوق را چاپ می کند.
وبعدازنمایش پیغام با استفاده ازتابعWinsock1.Close بسته می شود.
Server
———————————–
Private intmax As Long
Private Sub Command1_Click()
Winsock1(Val(Text3.Text)).SendData Text1.Text
End Sub
برای تبدیل یک مقداررشته ای به یک مقدار عددی ازتابع Val استفاده می شود.وسپس بعد از تبدیل آن به مقدار عددی آن را ارسال می کند.(ارسال از سوی Serverانجام می شود.)
Private Sub Form_Load()
intmax = 0
Winsock1(0).LocalPort = 1001
Winsock1(0).Listen
End Sub
مکان port را نشان می دهدکه دلخواه است.هرعددی می تواند باشد.
Winsock1(0).Listen وقفه ای جهت انتظار ویاآماده باش دادن به سمت client می باشد که اگر برنامه یا پروتکلی باز هست آن رامی بندد وبعد از آن ادامه کاررا انجام می دهد.
Private Sub Winsock1_Close(Index As Integer)
Unload Winsock1(Index)
End Sub
ازاین تابع برای جلوگیری ازترافیک های احتمالی استفاده می شود.
به این صورت که اگر داده ای ارسال شودو بعد متوجه شود که سمت client اشغال است از ارسال داده جلوگیری می کند.
Private Sub Winsock1_ConnectionRequest(Index As Integer,ByVal request ID As Long)
If Index = 0 Then
intmax = intmax + 1
Load Winsock1(intmax)
Winsock1(intmax).LocalPort = 0
Winsock1(intmax).Accept request ID
Load Text2(intmax)
End If
End Sub
این تابع جهت پیدا کردن آدرسIPی client مورداستفاده قرار می گیرد.
اگر در همان ابتدا آدرس را پیدا کند یک واحد به متغیر آن اضافه می کند تا آدرس IP های بعدی را نیز پیدا کند.
Private Sub Winsock1_DataArrival(Index As Integer,ByVal bytesTotal As Long)
Dim strdata As String
Winsock1(Index).GetData strdata
Text2(Index).Text = strdata
List1.AddItem Text2(Index).Text & "–>" & Str(Index)
Text3.Text = Index
End Sub
این تابع برای تعریف متغیرها استفاده می شود.
درآن آرایه ای با نام strdata تعریف شده و خروجی آن ازنوع رشته ای می باشد.
وجهت دریافت داده سمت clientاز GetData استفاده می کند.
وخروجی آن از نوع متن می باشدکه توسط Text2(Index).Text = strdata مشخص شده است.
دراینجا List1.AddItem Text2(Index).Text & "–>" & Str(Index) را داریم که بعد از ارسال داده برای آنکه به کاربر نشان دهد که کار اتمام پذیرفته پیغامی را در list box چاپ می کند.
فهرست
تاریخچه ویژوال بیسیک…………………………………………………………. 1
ویژوال بیسیک وفرآیند برنامه نویسی………………………………………… 2
آشنایی با جادوگرویژوال بیسیک……………………………………………… 3
برنامه نویسی رویدادگرا………………………………………………………….. 5
کار با ویژوال بیسیک……………………………………………………………… 5
آشنایی با محیط ویژوال بیسیک………………………………………………… 5
* میله ابزار………………………………………………………………………… 6
* جعبه ابزار……………………………………………………………………….. 7
* پنجره فرم……………………………………………………………………….. 7
* پنجره طراحی فرم…………………………………………………………….. 8
* پنجره پروژه…………………………………………………………………….. 8
کار با فایل در ویژوال بیسیک……………………………………………………. 11
* چگونگی بازکردن فایل…………………………………………………….. 12
* چگونگی بستن فایل…………………………………………………………. 14
* کاربا دایرکتوری……………………………………………………………… 15
* خواندن ازفایل…………………………………………………………………. 16
* نوشتن درفایل…………………………………………………………………. 18
* تعیین محل رکورددرفایلهای بادسترسی تصادفی……………………. 19
* تشخیص انتهای فایل………………………………………………………… 19
* به دست آوردن طول یک فایل…………………………………………… 20
* به دست آوردن محل اشاره گرفایل………………………………………20
پایگاه داده در ویژوال بیسیک…………………………………………………… 21
Visual Data Manager…………………………………………………… 23
Record Set……………………………………………………………………… 24
کنترل داده……………………………………………………………………………. 26
* طرزاستفاده ازکنترل داده……………………………………………………. 27
* تکنیک های پیشرفته کاربا کنترل داده………………………………….. 28
درارتباط با پروژه…………………………………………………………………… 30
* توضیحات کد برنامه…………………………………………………………. 30
* کاربا کنترل داده Winsock……………………………………………. 48
* کد برنامه……………………………………………………………………….. 58
2