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
- 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.
Semoga bermanfaat #HappyCoding #ExcelSakti
Comments
Post a Comment