Makale Özeti

Bu makalemizde VB.Net ile socket programlaya ufak bir giriş yapacağız. TCP/IP protokolünü kullanacağımız bu proje, sadece network işlemlerine giriş olarak hazırlanmıştır. İsteğinize göre geliştirebilir ve / veya kullanabilirsiniz.

Makale

Herkese Merhaba,

Herkese Merhaba,

  Bu makalemizde VB.Net ile socket programlaya ufak bir giriş yapacağız. TCP/IP protokolünü kullanacağımız bu proje, sadece network işlemlerine giriş olarak hazırlanmıştır. İsteğinize göre geliştirebilir ve / veya kullanabilirsiniz.

  MS Visual Basic 6.0 da socket işlemleri için kullandığımı Winsock nesnesinin yerini VB.Net de kullanıma hazır olarak System.Net.Sockets namespace’ i altındaki Socket nesnesi almış durumda. Belki eski Winsock nesne ile biraz farklı ama tabiki yenilik, yeniliktir. :) Mesela System.Net.Sockets.Socket  nesnesinin eventleri yok. Ama olsun bizde threadlerle bu eksiği gidermeye çalışıyoruz..

  Şimdi gelelim örnek programımıza. Örnek programın içeriği tabiki System.Net.Sockets.Socket nesnesini kullanarak bir multithreaded TCP/IP server örneği yapacağız.

   +  Örnek Program

 İşe yeni Visual Basic Windows Application projesi açarak başlayalım. Form1 isimli windows formumuzun üzerine; (Program ile ilgili örnek kodu http://www.infinity-soft.com/downloads/socketExp.rar adresinden çekebilirsiniz.)

         1-) startStop adında bir adet CommandButton

         2-) TextBox1 adında bir adet TextBox(Multiline ve Vertical Scroll propertyleri ile..)

  Daha aşağıdaki kodları projenize ekleyiniz.

Imports System.Text

Imports System.Net.Sockets

Imports System.Threading

Public Class Form1

    Inherits System.Windows.Forms.Form

    Private connCount As Long = 8090

    Private sckListener As New TcpListener(connCount)

    Private currSocket As Socket, procThread As Thread

    Private accptThread As Thread

    Private Listening As Boolean = False

    Private Read() As [Byte] = New Byte(1023) {}

    Private dataBuffer As [Byte]() = Nothing

    Private ASCII As Encoding = Encoding.ASCII

#Region " Windows Form Designer generated code "

    Public Sub New()

        MyBase.New()

        This call is required by the Windows Form Designer.

        InitializeComponent()

        Add any initialization after the InitializeComponent() call

    End Sub

    Form overrides dispose to clean up the component list.

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

        If disposing Then

            If Not (components Is Nothing) Then

                components.Dispose()

            End If

        End If

        MyBase.Dispose(disposing)

    End Sub

    Required by the Windows Form Designer

    Private components As System.ComponentModel.IContainer

    NOTE: The following procedure is required by the Windows Form Designer

    It can be modified using the Windows Form Designer. 

    Do not modify it using the code editor.

    Friend WithEvents startStop As System.Windows.Forms.Button

    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

        Me.startStop = New System.Windows.Forms.Button()

        Me.TextBox1 = New System.Windows.Forms.TextBox()

        Me.SuspendLayout()

       

        startStop

       

        Me.startStop.Location = New System.Drawing.Point(7, 9)

        Me.startStop.Name = "startStop"

        Me.startStop.Size = New System.Drawing.Size(281, 32)

        Me.startStop.TabIndex = 0

        Me.startStop.Text = "&Start Server"

       

        TextBox1

       

        Me.TextBox1.Location = New System.Drawing.Point(8, 48)

        Me.TextBox1.Multiline = True

        Me.TextBox1.Name = "TextBox1"

        Me.TextBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical

        Me.TextBox1.Size = New System.Drawing.Size(280, 112)

        Me.TextBox1.TabIndex = 2

        Me.TextBox1.Text = ""

       

        Form1

       

        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)

        Me.ClientSize = New System.Drawing.Size(292, 166)

        Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.TextBox1, Me.startStop})

        Me.Name = "Form1"

        Me.Text = "VB.Net Sample Socket Server"

        Me.ResumeLayout(False)

    End Sub

#End Region

    Private Sub startStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles startStop.Click

        If Not Listening Then

            sckListener.Start()

            startStop.Text = "&Stop Server"

            accptThread = New Thread(AddressOf ConnectionRequest)

            accptThread.Start()

            Listening = True

        Else

            sckListener.Stop()

            startStop.Text = "&Start Server"

            Listening = False

            accptThread.Suspend()

            accptThread = Nothing

        End If

    End Sub

    Private Function GetData(ByVal ByteArray() As Byte, ByRef currSocket As Socket, ByRef clientData As String) As Integer

        Dim totalBytes As Integer = currSocket.Receive(ByteArray, 1024, 0)

        Dim TempData As String = Encoding.ASCII.GetString(ByteArray)

        clientData = CStr(TempData)

        Return totalBytes

    End Function

    Private Sub SendData(ByVal currSocket As Socket, ByVal Data2Send As String)

        dataBuffer = New [Byte](Data2Send.Length + 1) {}

        Dim dataLength As Integer = ASCII.GetBytes(Data2Send, 0, Data2Send.Length, dataBuffer, 0)

        currSocket.Send(dataBuffer, dataLength, 0)

    End Sub

    Sub threadJump()

        Dim recData As String

        Dim recBytes As Integer

        While (currSocket.Connected)

            recBytes = GetData(Read, currSocket, recData)

            If recBytes = 0 Then Return

            Application.DoEvents()

            DataArrival(recData)

        End While

        Return

    End Sub

    Private Sub DataArrival(ByVal strData As String)

        TextBox1.Text = TextBox1.Text & strData

    End Sub

    Private Sub ConnectionRequest()

        While (Listening = True)

            currSocket = sckListener.AcceptSocket()

            procThread = New Thread(New ThreadStart(AddressOf threadJump))

            procThread.Start()

            Application.DoEvents()

        End While

    End Sub

    Friend WithEvents TextBox1 As System.Windows.Forms.TextBox

End Class

   ..ve programızı F5 ile çalıştıralım. Test etmek için Start Server buttonuna tıklayıp. Windows’ un telnet clientını çalıştıralım. Command linedan;

         telnet 127.0.0.1 8090

  Buradaki  127.0.0.1 makinamızın loopback adresidir. 8090  ise yazmış olduğumuz programdaki gelen istekleri kabul etmek için açtığımız port numarası. Daha sonra telnet client’ ından bastığımız her tuşun Vb.Net projemizdeki Textbox içerisine yazılıdığınız göreceksiniz.

  Şimdilik bu kadar.. Umarım yakında ikinci bölümünüde yazarım. Makale ile ilgili soru ve sorunlarınız için, omerduzyol@infinity-soft.com mail adresini kullanınız.

                  Ömer DÜZYOL

Infinity Software – Developing Solutions

http://www.infinity-soft.com/

Not : Bu makale ve ilgili örnekler ile bilgisayarınız bir zarar görürse bundan Infinity Software ve Ömer Düzyol sorumlu tutulamaz. Bu makale eğitim amacı ile yazılmış ve yayınlanmıştır.