Tutorial pembuatan aplikasi chating-client-server multi connection dengan menggunakan excel macro (VBA) dan ActiveX MSWINSCK.OCX (Chapter Server)


Hallo sodara – sodara sebangsa tanah dan sebangsa air. Saya kembali lagi nih dengan upload-an mengenai pembuatan tools sederhana chating-client-server dengan menggunakan…… tentunya sisaksi excel hehee..


Oke langsung aja ya kita mulai pembuatannya..


pastikan dulu ActiveX “MSWINSCK.OCX” sudah ada di pc kalian masing – masing.



Cara ceknya bisa cek di folder :


  • System32 untuk windows 32bit
  • SysWOW64 untuk windows 64bit

Jika tidak ada,

  • Download “MSWINSCK.OCX”.. cari aja di google
  • Copy ke folder System32/ SysWOW64 sesuai bit windows yang kalian pake.
  • Lalu Registry [regsvr32 MSWINSCK.OCX] melalui CMD(Run As Administrator)

Jika sudah ada.. ayo kita mulai membuat…

Sesuai dengan judul kali ini kita akan membuat server-nya terlebih dahulu
  • Buka Microsoft Office Excel. Dan rename sheet menjadi “SERVER” 
  • Klik tab Development. Dan insert tombol  atau ActiveX Control CommandButton. Dengan properties :
    •  Name                    : cmdShow
    • Caption                       : Show Form
 
  •  Klik 2kali untuk menuju ke VBA Editor.
  •  Insert “MSWINSCK.OXC” kedalam project dengan cara:
    • Klik Tools.
    • Klik References.
    • Browse. Dan cari “MSWINSCK.OXC” di folder “System32” untuk windows 32bit atau “SysWOW64” untuk windows 64bit. 
    •  Klik OK.
  • Rename nama sheet “Sheet1” menjadi “shServer” edit melalui tab Properties.

  • Lalu ketikan coding-an berikut 
Seperti pada gambar diatas.


  • Oke.. lanjut lagi dengan menambahkan 2 Userform dan 1CommadButton pada FrmMain, dengan properties  :
    • FrmMain  :
      • Name                       : FrmMain
      • Caption                    : Main
      •  ShowModal            : False
    • CommandButton pada FrmMain :
      • Name                       : cmdBeginListen
      • Caption                    : Begin Listen
    • FrmServer:
      • Name                       : FrmServer
      • Caption                    : Server
      • ShowModal             : False 



  • Pada menu Project – VBAProject klik kanan pada FrmMain dan klik View Code.

  • Setelah masuk ke editor code nya, paste coding berikut.

       

Option Explicit

' deklarasi sleep / waktu tunda
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal milisecond As Long)

' deklarasi variable tcpServer sebagai class MSWinsockLib.Winsock dengan events
' variable ini yang berfungsi me-routing client dengan dummy server
Private WithEvents tcpServer As MSWinsockLib.Winsock
Dim isConnect As Boolean

' deklarasi enum warna hanya pengganti bilangan angka aja supaya mudah diingat
Private Enum COLOR
    COLOR_IS_RED = 255          'RGB(256, 0, 0)
    COLOR_IS_GREEN = 65280      'RGB(0, 256, 0)
    COLOR_IS_BLUE = 16711680    'RGB(0, 0, 256)
    COLOR_IS_WHITE = 16777215   'RGB(256, 256, 256)
    COLOR_IS_BLACK = 0          'RGB(0, 0, 0)
End Enum

' deklarasi state socket / tcp
Private Enum SOCKET_STATE
    SCK_CLOSED = 0
    SCK_OPEN = 1
    SCK_LISTENING = 2
    SCK_CONNECTION_PENDING = 3
    SCK_RESOLVING_HOST = 4
    SCK_HOST_RESOLVED = 5
    SCK_CONNECTING = 6
    SCK_CONNECTED = 7
    SCK_CLOSING = 8
    SCK_ERROR = 9
End Enum

' tombol on-off
Private Sub cmdBeginListen_Click()
    ' membuat variable isConnect selalu bernilai kebalikan nilai sebelumnya
    isConnect = Not isConnect
    
    If isConnect Then
        ' isConnect bernilai true
        ' create tcpServer sebagai class MSWinsockLib.Winsock baru
        ' set ip di localhost, karena default tcpServer.LocalIP = "127.0.0.1", maka tidak perlu di set lagi
        ' set port di 1200
        Set tcpServer = New MSWinsockLib.Winsock
        tcpServer.LocalPort = 1200
        
        ' dan.. mulai server.
        tcpServer.Listen
        
        ' perintah dibawah hanya untuk informasi
        cmdBeginListen.Caption = "Server Listening..."
        cmdBeginListen.BackColor = COLOR.COLOR_IS_GREEN
    
        Me.Caption = "Main - <IP>" & tcpServer.LocalIP & ":<Port>" & tcpServer.LocalPort
    Else
        ' isConnect bernilai false
        ' tutup dan reset nilai pada tcpServer
        tcpServer.Close
        Set tcpServer = Nothing
        
        ' tutup semua FrmServer atau dummy server
        Dim frm As Object
        For Each frm In UserForms
            If UCase(TypeName(frm)) = "FRMSERVER" Then Unload frm
        Next
    
        ' perintah dibawah hanya untuk informasi
        cmdBeginListen.Caption = "Begin Listen"
        cmdBeginListen.BackColor = COLOR.COLOR_IS_RED
    
        Me.Caption = "Main"
    End If
End Sub

' procedure untuk me-routing client dengan dummy server
' karena memang di vb6 tidak bisa multithreading
' mungkin programer lain bisa tapi saya tidak bisa, hehee
' jadi saya buat seolah - olah multithreading
' dengan cara .....
Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
    ' buat variable frm_Server selalu jadi class FrmServer baru
    Dim frm_Server As New frmServer
    
    ' load class tersebut
    Load frm_Server
    
    ' dan show dengan nilai showmodal false (agar bisa klik range saat Form di aktifkan)
    frm_Server.Show False
    
    ' lalu mulai dummy server untuk menerima data dari client yang terhubung
    frm_Server.StartListen requestID
End Sub

' merupakan event bawaan dari UserForm
' fungsi ini berjalan ketika FrmMain di close
' dan fungsi ini berfungsi untuk menghentikan dummy server
Private Sub UserForm_Terminate()
    Dim frm As Object
    For Each frm In UserForms
        If UCase(TypeName(frm)) = "FRMSERVER" Then frm.StopListen
    Next
End Sub        
 
  • Setelah itu, klik kanan pada FrmServer dan klik kanan. Pilih view code (sama seperti diatas). Dan pastekan codingan berikut

       

Option Explicit
 
' deklarasi sleep / waktu tunda
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal milisecond As Long)

' deklarasi variable tcpServerForClient sebagai class MSWinsockLib.Winsock dengan events
Private WithEvents tcpServerForClient As MSWinsockLib.Winsock
Dim reqID As Long
Dim isConnect As Boolean

' deklarasi enum warna hanya pengganti bilangan angka aja supaya mudah diingat
Private Enum COLOR
    COLOR_IS_RED = 255          'RGB(256, 0, 0)
    COLOR_IS_GREEN = 65280      'RGB(0, 256, 0)
    COLOR_IS_BLUE = 16711680    'RGB(0, 0, 256)
    COLOR_IS_WHITE = 16777215   'RGB(256, 256, 256)
    COLOR_IS_BLACK = 0          'RGB(0, 0, 0)
End Enum

' deklarasi state socket / tcp
Private Enum SOCKET_STATE
    SCK_CLOSED = 0
    SCK_OPEN = 1
    SCK_LISTENING = 2
    SCK_CONNECTION_PENDING = 3
    SCK_RESOLVING_HOST = 4
    SCK_HOST_RESOLVED = 5
    SCK_CONNECTING = 6
    SCK_CONNECTED = 7
    SCK_CLOSING = 8
    SCK_ERROR = 9
End Enum

' properti get untuk mendapatkan nilai reqID dari luar class FrmServer
Public Property Get ID() As Long
    ID = reqID
End Property

' menerima client yang di-routing olen FrmMain
' dengan memmasukan ID client ke dalam variable requestID
Public Sub StartListen(ByVal requestID As Long)
    ' create new class
    Set tcpServerForClient = New MSWinsockLib.Winsock
    
    ' set port
    tcpServerForClient.LocalPort = 0
    
    ' terima client kedalam variable
    tcpServerForClient.Accept requestID
    
    ' perintah dibawah hanya untuk informasi
    reqID = requestID
    Me.Caption = "Server for client <" & requestID & ">"
End Sub

' mematikan dan me-reset variable tcpServerForClient
Public Sub StopListen()
    ' matikan koneksi
    tcpServerForClient.Close
    
    ' reset variable tcpServerForClient ke nilai null/nothing
    Set tcpServerForClient = Nothing
    
    ' close form FrmServer,
    ' karena saat ada client baru, FrmServer selalu dipanggil sebagai class baru
    ' New FrmServer
    Unload Me
End Sub

' mengirim data yang diterima dari client<0>
' dan dikirim kembali ke client<0>
' client<0> adalah client yang terhubung dengan FrmServer yang telah dipanggil sebagai New class
Public Sub SendDataToClient(ByVal data As String)
    tcpServerForClient.SendData data
End Sub

' merupakan event bawaan dari class MSWinsockLib.Winsock
' sub ini berfungsi saat client<0>,
' client yang terhubung dengan class ini mengirim data
Private Sub tcpServerForClient_DataArrival(ByVal bytesTotal As Long)
    ' tolak semua error dan melanjutkan
    On Error Resume Next
    
    ' naahh..
    ' ini adalah perintah menerima data dari client<0>
    ' data tersebut nantinya akan disimpan di variable data yang berupa string
    Dim data As String
    tcpServerForClient.GetData data

    ' mendapatkan semua userform yang telah di load oleh FrmMain
    ' setelah mendapat userform yang ber-type FrmServer
    ' maka data akan dikirim ke semua client
    ' kecuali client<0>
    Dim f As Object
    For Each f In UserForms
        DoEvents
        If UCase$(TypeName(f)) = "FRMSERVER" Then
            If f.ID <> reqID Then
                f.SendDataToClient data
            End If
        End If
    Next
End Sub

' merupakan event bawaan dari class MSWinsockLib.Winsock
' sub ini berfungsi saat client<0>,
' client yang terhubung dengan class ini memutus koneksi
Private Sub tcpServerForClient_Close()
    StopListen
End Sub        
 
  • Oke selesai pembuatan tools server nya.
Postingan berikutnya untuk pembuatan client nya. 
Semoga bermanfaat #HappyCoding #ExcelSakti


















Comments