Visual Basic kullanarak bir sohbet programı yapmak oldukça mümkündür. Bu örnekte, bir istemci-sunucu modeli kullanarak basit bir sohbet programı yapacağız. İstemci, sunucuya bağlanacak ve mesajlarını gönderip alabilecek, sunucu ise bağlı tüm istemcilere gelen mesajları yayınlayacak.
İstemci tarafı için aşağıdaki adımları izleyebilirsiniz:
Yeni bir Windows Form uygulaması oluşturun ve form üzerinde iki adet TextBox (birincisi kullanıcı adını, ikincisi mesajı yazmak için), bir adet Button (mesaj göndermek için) ve bir adet RichTextBox (mesajları göstermek için) ekleyin.
Imports System.Net.Sockets satırı ile System.Net.Sockets ad alanını ekleyin.
İstemci tarafında bir TcpClient nesnesi oluşturun ve sunucuya bağlanın. Bağlantı başarılı olursa, bir NetworkStream nesnesi oluşturun ve mesajları okuyup yazmak için kullanın.
Mesajları yazmak için TextBox kontrolündeki metni NetworkStream nesnesi üzerinden sunucuya gönderin. Mesajlar okunduğunda, RichTextBox kontrolüne ekleyin.
Bağlantıyı kesmek için bir düğme ekleyin ve düğmeye tıklanınca sunucuya kapatma isteği gönderin.
İşte örnek bir Visual Basic istemci kodu:
vb.net
Public Class Form1
Private tcpClient As TcpClient
Private stream As NetworkStream
Private isConnected As Boolean
Private Sub btnConnect_Click(sender As Object, e As EventArgs) Handles btnConnect.Click
Try
tcpClient = New TcpClient()
tcpClient.Connect(txtServer.Text, CInt(txtPort.Text))
stream = tcpClient.GetStream()
' Sunucuya kullanıcı adını gönderin
Dim username As String = txtUsername.Text
Dim message As Byte() = System.Text.Encoding.ASCII.GetBytes(username)
stream.Write(message, 0, message.Length)
' Okuma işlemi için bir arka plan görevi başlatın
Dim receiveTask As New Task(Sub() ReceiveData())
receiveTask.Start()
btnConnect.Enabled = False
btnDisconnect.Enabled = True
btnSend.Enabled = True
txtUsername.ReadOnly = True
txtServer.ReadOnly = True
txtPort.ReadOnly = True
isConnected = True
Catch ex As Exception
MessageBox.Show(ex.Message, "Connection error")
End Try
End Sub
Private Sub btnDisconnect_Click(sender As Object, e As EventArgs) Handles btnDisconnect.Click
' Sunucuya bağlantıyı kapatma isteği gönderin
Dim message As Byte() = System.Text.Encoding.ASCII.GetBytes("/exit")
stream.Write(message, 0, message.Length)
isConnected = False
btnConnect.Enabled = True
btnDisconnect.Enabled = False
btnSend.Enabled = False
txtUsername.ReadOnly = False
txtServer.ReadOnly = False
txtPort.ReadOnly = False
stream.Close()
tcp
End Sub
Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
' Mesajı gönderin
Dim message As Byte() = System.Text.Encoding.ASCII.GetBytes(txtMessage.Text)
stream.Write(message, 0, message.Length)
txtMessage.Text = ""
End Sub
Private Sub ReceiveData()
While isConnected
If tcpClient.Available > 0 Then
' Gelen veriyi okuyun
Dim data(tcpClient.Available - 1) As Byte
stream.Read(data, 0, data.Length)
Dim message As String = System.Text.Encoding.ASCII.GetString(data)
' Ekrana yazdırın
Me.Invoke(Sub() DisplayMessage(message))
End If
Threading.Thread.Sleep(100)
End While
End Sub
Private Sub DisplayMessage(ByVal message As String)
rtbMessages.AppendText(message & vbCrLf)
1. Yeni bir Windows Form uygulaması oluşturun ve form üzerinde bir `TextBox` (port numarası), bir `Button` (başlatma/kapatma düğmesi) ve bir `RichTextBox` (mesajları göstermek için) ekleyin.
2. `Imports System.Net.Sockets` satırı ile `System.Net.Sockets` ad alanını ekleyin.
3. Sunucu tarafında bir `TcpListener` nesnesi oluşturun ve belirtilen port numarasını dinlemeye başlayın.
4. İstemci bağlantıları kabul edildiğinde, `TcpClient` nesneleri oluşturun ve bunları bir `List` nesnesinde saklayın.
5. Mesajları okumak için, bağlı tüm istemci bağlantıları üzerinden döngü oluşturun. Her istemcinin `NetworkStream` nesnesini kullanarak gelen mesajları okuyun ve diğer tüm istemcilere gönderin.
6. Sunucu kapatma isteği aldığında, tüm istemci bağlantılarını kapatın ve sunucuyu kapatın.
İşte örnek bir Visual Basic sunucu kodu:
```vb.net
Imports System.Net.Sockets
Public Class Form1
Private tcpListener As TcpListener
Private clients As New List(Of TcpClient)
Private isRunning As Boolean
Private Sub btnStartStop_Click(sender As Object, e As EventArgs) Handles btnStartStop.Click
If isRunning Then
' Sunucuyu kapatın
For Each client In clients
client.Close()
Next
tcpListener.Stop()
btnStartStop.Text = "Başlat"
txtPort.ReadOnly = False
isRunning = False
Else
Try
' Sunucuyu başlatın
tcpListener = New TcpListener(System.Net.IPAddress.Any, CInt(txtPort.Text))
tcpListener.Start()
' Bağlantıları kabul etmek için bir arka plan görevi başlatın
Dim acceptTask As New Task(Sub() AcceptClients())
acceptTask.Start()
btnStartStop.Text = "Durdur"
txtPort.ReadOnly = True
isRunning = True
Catch
MessageBox.Show("Bağlantı hatası")
End Try
End If
End Sub
Private Sub AcceptClients()
While isRunning
If tcpListener.Pending Then
' Yeni bir istemci bağlantısı kabul edin
Dim client = tcpListener.AcceptTcpClient()
' İstemciyi listeye ekleyin
clients.Add(client)
' İstemci bağlantısı için yeni bir arka plan görevi başlatın
Dim clientTask As New Task(Sub() HandleClient(client))
clientTask.Start()
End If
Threading.Thread.Sleep(100)
End While
End Sub
Private Sub HandleClient(ByVal client As TcpClient)
Dim stream As NetworkStream = client.GetStream()
While isRunning
If client.Connected AndAlso stream.DataAvailable Then
' Gelen mesajı okuyun
Dim data(client.Available - 1) As Byte
stream.Read(data, 0, data.Length)
Dim message As String = System.Text.Encoding.ASCII.GetString(data)
' Mesajı diğer istemcilere gönderin
For Each otherClient In clients
If otherClient IsNot client Then
Dim otherStream As NetworkStream = otherClient.GetStream()
otherStream.Write(data, 0, data.Length)
End If
Next
' Mesajı kendi sunucu formunuzda da gösterin
Me.Invoke(Sub() DisplayMessage(message))
End If
Threading.Thread.Sleep(100)
End While
' İstemci bağlantısını kapatın
clients.Remove(client)
client.Close()
End Sub
Private Sub DisplayMessage(ByVal message As String)
rtbMessages.AppendText(message & vbCrLf)
