Home > Visual Basic, Winsock > Aplikasi Antrian

Aplikasi Antrian

February 26, 2012

Aplikasi ini merupakan pengembangan dari sample aplikasi yg sudah pernah saya bahas pada postingan sebelumnya, aplikasi ini terdiri dari 2 project yaitu :

  1. Aplikasi server memanfaatkan array winsock karena akan menghandle minimal 1 koneksi
  2. Untuk aplikasi klien cukup menggunakan winsock standar (non array).

Sekarang akan kita bahas cara pembuatannya.

Aplikasi server

Aplikasi server menggunakan winsock yg dijadikan array karena akan menerima lebih dari 1 koneksi, untuk menjadikan sebuah winsock menjadi array cukup dengan mengeset properties index = 0

Selain itu agar sebuah winsock bisa menerima koneksi yg masuk, maka winsocknya harus dalam mode “Listen”, untuk keperluan ini kita akan menyiapkan sebuah fungsi misal dengan nama startListening

Private Function startListening(ByVal localPort As Long) As Boolean
    On Error GoTo errHandle

    If localPort > 0 Then
        'If the socket is already listening, and it's listening on the same port, don't bother restarting it.
        If (wckServer(0).State <> sckListening) Or (wckServer(0).localPort <> localPort) Then
            With wckServer(0)
                Call .Close
                .localPort = localPort
                Call .Listen
            End With
        End If

        'Return true, since the server is now listening for clients.
        startListening = True
   End If

   Exit Function
errHandle:
   startListening = False
End Function

Selanjutnya tinggal kita panggil pada event Form_Load

Private Sub Form_Load()
    '1234 adalah port yg digunakan untuk komunikasi
    'antara server dan klien, nilainya bisa disesuaikan
    If startListening(1234) Then
        MsgBox "Status Server ON"
    Else
        MsgBox "Status Server OFF"
    End If
End Sub

Selain itu ada beberapa kode yang harus kita lengkapi pada event2x yg dimiliki oleh winsock yaitu event Close, ConnectionRequest, DataArrival dan Error

Private Sub wckServer_Close(Index As Integer)
    ' Close the socket and raise the event to the parent.
    Call wckServer(Index).Close
End Sub
Private Sub wckServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    Dim i          As Long
    Dim j          As Long
    Dim blnLoaded  As Boolean

    On Error GoTo errHandle

    ' We shouldn't get ConnectionRequests on any other socket than the listener
    ' (index 0), but check anyway. Also check that we're not going to exceed
    ' the MaxClients property.
    If (Index = 0) Then
        ' Check to see if we've got any sockets that are free.
        For i = 1 To wckServer.UBound
            If (wckServer(i).State = sckClosed) Then
                j = i
                Exit For
            End If
        Next i

        ' If we don't have any free sockets, load another on the array.
        If (j = 0) Then
            blnLoaded = True
            Call Load(wckServer(wckServer.UBound + 1))
            j = wckServer.Count - 1
        End If

        ' With the selected socket, reset it and accept the new connection.
        With wckServer(j)
            Call .Close
            Call .Accept(requestID)
        End With

    End If

    Exit Sub
    '
errHandle:
    ' Close the Winsock that caused the error.
    Call wckServer(0).Close
End Sub

Event ConnectionRequest berfungsi untuk memfilter koneksi yg masuk, jika ada koneksi yg masuk akan dilakukan pengecekan terlebih dulu apakah ada winsock yg idle (ngangur) jika ada maka koneksi tersebut akan langsung dihandle oleh winsock yg idle tadi, jika tidak maka akan diload terlebih dulu winsock yg baru kemudian langsung menghandle koneksi yg baru masuk tadi.

Teknik ini merupakah salah satu cara untuk melakukan optimasi program jangan sampai aplikasi server meload secara terus menerus objek winsock yg baru untuk setiap koneksi yg masuk.

Private Sub wckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim cmd     As String

    On Error GoTo errHandle

    ' Grab the data from the specified Winsock object, and pass it to the parent.
    Call wckServer(Index).GetData(cmd)

    Select Case cmd
        Case "get_no_antrian"
            Call send(Index, CStr(noAntrian))

            lblNoAntrian.Caption = noAntrian
            noAntrian = noAntrian + 1 ' naikkan counter nomor antrian

        Case Else
            Call send(Index, "perintah tidak dikenal")
    End Select

    Exit Sub
errHandle:
   Call wckServer(Index).Close
End Sub

Event DataArrival berfungsi untuk memproses data yg masuk, untuk kasus aplikasi antrian ini data yang paling valid hanya berupa string “get_no_antrian”, jika datanya valid akan langsung dikirimkan nomor antrian terakhir ke klien yg mengirimkan string “get_no_antrian” dg memanggil prosedur send.

Private Sub send(ByVal lngIndex As Long, ByVal strData As String)
    If (wckServer(lngIndex).State = sckConnected) Then
        Call wckServer(lngIndex).SendData(strData): DoEvents
    Else
        Exit Sub
    End If
End Sub
Private Sub wckServer_Error(Index As Integer, 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)
    Call wckServer(Index).Close
End Sub

Untuk aplikasi server sy rasa sudah cukup akan kita lanjutkan dg aplikasi klien.

Aplikasi Klien

Untuk aplikasi klien lebih sederhana lagi, yg kita butuhkan cukup sebuah fungsi untuk melakukan koneksi ke server

Private Const conTunggu As Long = 100000
Private Function isConnected(ByVal ipServer As String, ByVal port As Long) As Boolean
    Static i As Long

    On Error Resume Next

    If myClient.State <> sckClosed Then myClient.Close ' close existing connection
    myClient.RemoteHost = ipServer
    myClient.RemotePort = port
    myClient.Connect

    With myClient
        Do Until .State = sckConnected
            DoEvents
            i = i + 1
            If i >= conTunggu Then
                i = 0
                Exit Function
            End If
        Loop
    End With

    isConnected = myClient.State = sckConnected
End Function

Contoh pemanggilan fungsi diatas seperti berikut :

Private Sub cmdAmbilNoAntrian_Click()
    Dim ipServer    As String
    Dim cmd         As String

    ipServer = "127.0.0.1"
    cmd = "get_no_antrian"

    ' 1234 ada port yg menyesuaikan port yg ada di server
    If isConnected(ipServer, 1234) Then
        myClient.SendData cmd
    End If
End Sub

Untuk mengetahui data yang dikirim balik oleh server kita bisa memanfaatkan event DataArrival yg dimiliki oleh objek winsock

Private Sub myClient_DataArrival(ByVal bytesTotal As Long)
    Dim noAntrian As String

    On Error Resume Next

    myClient.GetData noAntrian
    lblNoAntrian.Caption = noAntrian
End Sub

Selesai ๐Ÿ™‚

Aplikasi diatas belum menggunakan database sama sekali, sehingga jika aplikasi server ditutup maka counter nomor antrian akan dimulai dari 1 lagi, dan sy berharap tidak ada pertanyaan bagaimana menyimpan counter nomor antriannya ke database atw bagaimana cara menampilkan nomor atrian terakhir klo servernya error :D.

Selamat MENCOBA ๐Ÿ™‚

  1. Hidayat
    February 26, 2012 at 12:46 pm

    thank om…buat referensi nya…. ๐Ÿ™‚

    • February 27, 2012 at 5:25 am

      Sama2x om

  2. March 2, 2012 at 5:57 pm

    Wah tutorial ya makin mantap aja neh tuk coding4ever ….sukses selalu

    Mas admin, mau tanya neh…..saya lagi coba buat program desktop dengan vb6 tapi koneksi ya mau online…nah,klw database di hosting kan berat tuk olah record/data ya…
    saya mau jajal koneksi ya menggunakan VPN…ada tutorial ya gak mas tuk cara buat koneksi VPN….

    • March 3, 2012 at 11:21 am

      Klo mau yg gratis dan gampang bisa mencoba hamachi, kalo mau yg gratis juga tapi agak sedikit ribet mungkin bisa mencoba OpenVPN.

  3. March 5, 2012 at 12:10 pm

    Klw langsung buat VPN ya lwt windows gimana mas …. dari network connection ya …?

    • March 5, 2012 at 4:06 pm

      Klo langsung setau sy enggak bisa om

  4. March 6, 2012 at 11:17 am

    Ya mas saya jajal juga gak bisa-bisa,menurut mas admin gimana neh solusinya klw aplikasinya mau dibuat online saya harus menggunakan koneksi seperti apa agar olah record ya kyk clinet/server …saya guna’in database MySQL mas….Sebelumnya makasih banget mas admin atas penyampaian Ilmu dan saran ya ….

    • March 9, 2012 at 3:36 pm

      Yg jelas untuk kasus seperti ini sy biasanya menggunakan web service om.
      Untuk web servicenya bisa pake VB .NET atw C# (klo sy pake bahasa ini).

      • March 9, 2012 at 4:36 pm

        Klw mau pake vb6 gimana mas solusi terbaik ya …Please help mas admin ……

        • March 9, 2012 at 7:54 pm

          Mungkin bukan solusi terbaik sih om, utk vb6 yg pernah sy coba koneksi antar cabang ya menggunakan VPN dg bantuan hamachi.

          Kantor cabang dan pusat sama2x menggunakan koneksi speedy, tapi klo databasenya dihostingkan di ISP ini yg agak susah om.

          Solusi lain yg bisa dicoba untuk servernya menggunakan layanan Virtual Private Server nah klo ini selain dapat ip public kita juga full akses ke server, untuk sewanya juga murah berkisar 300-500 rb tergantung fiturnya sih ๐Ÿ˜€

  5. March 12, 2012 at 9:15 am

    Oh, ok mas admin thaks……tp gini mas di tmp saya punya IP PUBLIC mas saya coba koneksi antar cabang berhasil seh, tp lemot klw guna’in IP Public ….

    • March 12, 2012 at 3:58 pm

      Ya seperti itu lah om klo langsung nembak database berat, makanya mulailah untuk mencoba teknologi lain semacam web service untuk kedepannya.

      VB 6 bisa akses web service juga loh om, jadi untuk web servicenya bisa dicoding menggunakan VB .NET atw C# untuk klien mau tetap pake VB 6 juga enggak masalah.

      Oke deh om sukses deh dg projectnya ๐Ÿ™‚

      • March 13, 2012 at 2:08 pm

        Waduh mas ribet buanget kyk ya sya semakin gak sanggup ne ….. memang harus tekun dan terus berusaha …… OK deh mas thaks buanget tuk penjelasannyaa…semoga sukses trs buat mas k4m4r82….. ๐Ÿ™‚

        • March 14, 2012 at 9:09 am

          Oke om sama2x ๐Ÿ™‚

  6. March 13, 2012 at 1:03 am

    wah om kamar keren nih tipe pengembangan antriannya pake winsock
    kalo kami lebih nyaman pake metod tarik data dari db.

    sukses terus buat blognya, dan jangan berenti buat berbagi ya ๐Ÿ™‚

    • March 14, 2012 at 9:12 am

      Iya om soalnya jauh lebih cepat, selain itu kan data yg ditransfer juga kecil, emg pake database apa om ? ๐Ÿ˜€

  7. AngeL
    March 29, 2012 at 10:31 pm

    Om suhuu, mo tny. Jd crtny pgn mengembangkan aplikasi ini pake printer dotmatix dan kertasny roll paper. Dan the problem is, kertasny bablas T.T Ga mo berhenti om. Ini percobaan pake Epson LX 800, port USB. Ad saran ga om? Kalo pake kertas Letter biasa, kertasny jg bablas. Code yg ud tak pake:

    Printer.Print lblNoAntrian.Caption
    Printer.EndDoc

    dan

    Me.PrintForm

    Dua2ny begitu T.T Mohon bantuan om.. Thx before,

    • AngeL
      March 29, 2012 at 11:38 pm

      Mf om suhu, ud solved nih. Buat tmn2 lainny, tak kasi referensi codingny.

      Link: http://support.microsoft.com/kb/154078

      Hee, makasi om suhu ๐Ÿ˜‰

      • March 30, 2012 at 9:40 am

        Oke om sippp ๐Ÿ™‚

  8. gugun
    April 9, 2012 at 12:08 pm

    mas admin gimana cara memanggil data antrian yang sudah keluar untuk di panggil ulang

    • April 9, 2012 at 4:03 pm

      Klo ini ya harus diisimpan ke database dulu om nomor antriannya, cara lainnya bisa juga menggunakan array atau class dictionary

      • gugun
        April 10, 2012 at 12:58 pm

        maaf mas, kami ini masih awam jadi kurang nyambung, mohon bantuan kalau bisa di kirim contoh code array atau class dictionary ke email kami, makasih mas sebelumnya.

        • April 10, 2012 at 3:02 pm

          Wah report nih klo semua pengunjung minta dikirimin source code ๐Ÿ˜›

          • gugun
            April 11, 2012 at 12:40 pm

            sorry mas kalau ngerepotin, tetapi terima kasih atas ilmu yang sudah di sharingkan oleh mas admin ini sungguh membantu kami yang awam untuk belajar semoga allah membalasnya.

            • April 11, 2012 at 1:18 pm

              Amin
              Berarti udah bisa nyelesain sendiri nih kasusnya ๐Ÿ˜€

  9. admin_yames
    April 10, 2012 at 11:03 pm

    ikut nyimak dan ikut copas mas admin.

    • April 11, 2012 at 4:01 am

      Oke om, yg penting jangan minta dikirimin source code juga ๐Ÿ˜€

      • yames
        May 1, 2012 at 3:10 pm

        Wah kalau itu belum dah gan. sy masih trial error dari petunjuk sang admin dlu. xixixi…ini juga masih trial error dlu gan.
        Kalau menemui kesulitan baru sy tanya lagi gan. thx b4.

        • May 3, 2012 at 4:34 pm

          Nah klo ginikan baru manteb ๐Ÿ™‚

  10. ferdy
    April 25, 2012 at 11:28 am

    om admin, berarti ini tiap client butuh komputer ya??
    saya pernah liat di bank, mereka cuma pake keyboard yg hanya tombol angkanya aja…
    nah klo yg kayak gitu, gimana ya om??

  11. April 25, 2012 at 11:39 am

    Yah klo buat sendiri perangkatnya/beli, sama seperti di ATM yang perangkat inputnya diminimalis

  12. ferdy
    April 27, 2012 at 10:02 am

    oh gitu ya omz,
    klo saya mau simpan ke database..
    kodingnya ditaruh dimana ya omz??
    di aplikasi servernya ya??

    • April 27, 2012 at 1:05 pm

      Yg akses ke database cukup aplikasi server aja, di klien cukup mengirim data seperti ini contohnya :

      Winsock1.SendData "insert#barang#data1;data2;data3"
      

      Ketika server menerima data diatas langsung diparsing, misal perintahnya adalah insert, nama tabelnya adalah barang trus data yg diinsertkan apa saja yaitu data1, data2 dan data3

      Kode berikut mungkin bisa ngasih pencerahan ๐Ÿ˜€

      Private Sub wckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
          Dim cmd         As String
          Dim arrCmd()    As String
          Dim arrData()   As String
          
          Dim perintah    As String
          Dim tabel       As String
          
          On Error GoTo errHandle
      
          ' Grab the data from the specified Winsock object, and pass it to the parent.
          Call wckServer(Index).GetData(cmd)
      
          ' TODO : tambahkan validasi untuk pengecekan data yg masuk
          arrCmd = Split(cmd, "#")
          
          perintah = arrCmd(0) ' ex : insert
          tabel = arrCmd(1) ' ex : barang
          arrData = Split(arrCmd(2), ";")
          
          Select Case perintah
              Case "insert"
                  Select Case tabel
                      Case "barang":
                          strSql = "INSERT INTO barang (field_1, field_2, field_n) " & _
                                   "VALUES ('" & arrData(0) & "', '" & arrData(1) & "', '" & arrData(2) & "')"
                      Case "customer"
                          ' todo : perintah insert customer
                      Case "tabel lainnya"
                          ' todo : perintah insert lainnya
                  End Select
          
              Case "update"
              Case "delete"
              Case "select"
          End Select
              
          Exit Sub
      errHandle:
         Call wckServer(Index).Close
      End Sub
      
      • ferdy
        April 27, 2012 at 2:40 pm

        mantafff.. om.. luar biasa…
        ane coba dulu ya…
        nanti klo ada masalah, boleh kan tanya lagi..
        mudah2an ga bosan ๐Ÿ™‚
        terima kasih om..

        • April 28, 2012 at 6:05 am

          Oke om sipp ๐Ÿ™‚

  13. uji
    May 2, 2012 at 10:05 pm

    sip……
    trims q pengen coba ni…..

    • May 3, 2012 at 4:40 pm

      Silahkan om ๐Ÿ™‚

  14. ardi
    May 8, 2012 at 9:48 am

    mas, mau nanya, gimana kalau client akan mengirim dua variabel ke server dengan winsock
    dan bagaimana server menerimanya, mohon pencerahannya mas.
    contoh nya spt ini
    untuk client
    Winsock1.SendData var1, var2 (contoh nya saja)

    dan untuk menerimanya disisi server bagaimana mas.

    mohon bantuannya.
    terimakasih

    • May 8, 2012 at 10:03 am

      Udah liat jawabannya sy di nomor #33 diatas belum om ?

      Jadi waktu ngirimnya dipisah menggunakan separator misal karakter #

      Dim var1 As String
      Dim var2 As String
      
      var1 = "isi var1"
      var2 = "isi var2"
      
      Winsock1.SendData var1 & "#" & var2
      
  15. ardi
    May 8, 2012 at 11:24 am

    thanks mas bantuannya, udah ok.
    satu lg mas, gmn caranya untuk membuat 2 counter terpisah mas?
    misalnya client1, client2, client3 tergabung dalam satu counter misalnya teller,
    sedangkan client 4, client5 tergabung dalam counter custommer service
    jadi pada sisi server terdapat dua counter teller dan CS mas.
    mohon bantuannya mas. terimakasih.

    • May 8, 2012 at 11:36 am

      buat command yg berbeda misal client 1,2,3 mengirim data “get_no_antrian#1” kemudian untuk klien 4 dan 5 data “get_no_antrian#2”.

      trus diserver juga otomatis mempunyai 2 variabel counter untuk menghandle masalah ini

  16. July 23, 2012 at 10:21 am

    mungkin OOT dengan coding diatas.. mas punya code buat menampilkan siaran TV di VB6 ? jadi di PC dipasangkan TV tuner.. trus siarannya nanti muncul di form yg di buat di VB6.. seperti tampilan dilayar antrian BANK gitu..

    • July 23, 2012 at 12:37 pm

      Coba disini om.

      • May 29, 2013 at 12:00 pm

        Om Kalo pake komponen itu layar tv ga bisa di buat besar yah?Ada solusi supaya tampilan nya bisa kita setting?atau ada komponen lain?

  17. wawan
    September 23, 2012 at 2:40 pm

    mantap neh om tks berat ilmu y ,mudah2an bermanfaat dan berguna ..trimakasih …

  18. jony
    November 1, 2012 at 4:07 pm

    om sy jga prnah buat aplikasi antrian database ms acces, tp sya gag pakai winsock, dan aplikasinya sampai sekarang masih running well. yg sya tanyakan apa kelemahannya aplikasi antrian sya yg gag pakek winsock dengan mesin antrian om yg pakek winsock ? mohon pencerahanya om, thx… ๐Ÿ™‚

  19. November 20, 2012 at 10:49 am

    thanks gan aku langsung di coba nie,. ๐Ÿ™‚

  20. lilik
    November 30, 2012 at 4:57 am

    maav ini pke b.pmrogram apa
    q bru” bljar

  21. lilik
    November 30, 2012 at 5:05 am

    mksi
    bermanfaat banget ๐Ÿ˜€

  22. Rafles Gusta
    July 20, 2013 at 5:52 pm

    gan kalau untuk membuat aplikasi pengontrolan proses belajar mengajar dengan banyak pc gimana ???
    please share……

  23. firman
    August 18, 2013 at 1:12 pm

    salam kenal mas, mw tanya nih, sy ud coba2 untuk menampilkan label “kasir ke” di form server kok gagal trus y, mhn pencerahannya mas..makasih…minal minul y mas…

    • August 19, 2013 at 12:59 pm

      Klo sample asli di atas jalan enggak ?

      • August 19, 2013 at 1:57 pm

        jalan mas…Perfect, tp saya ingin menambahkan texbox/label untuk menampilkan kasir ke di form server..helep mas

        • August 19, 2013 at 2:06 pm

          Enggak bisanya dimana om ? Harus spesifik nanyanya.
          Yang sudah om coba juga sejauh mana ? Sy kan juga enggak tau alur program yg ingin om buat seperti apa.

          • fireman
            August 19, 2013 at 2:12 pm

            pada form klien 01 ketika mengklik ambil antrian, maka di serevr jg keliatan label kasirnya..sy diajarin ya…, makasih perhatiannya

            • August 19, 2013 at 3:36 pm

              Pada saat klien ingin mengambil no antrian, kan perintahnya seperti berikut :

              Private Sub cmdAmbilNoAntrian_Click()
                  Dim ipServer    As String
                  Dim cmd         As String
                  
                  ipServer = "127.0.0.1"
                  cmd = "get_no_antrian"
                  
                  If isConnected(ipServer) Then
                      myClient.SendData cmd
                  End If
              End Sub
              

              Coba perhatikan kode di atas data yg dikirim ke serverkan cuma “get_no_antrian”, jika ingin informasi kliennya nampil ya otomatis nomor kliennya juga harus dikirim. Contoh :

              cmd = "get_no_antrian#" & txtNoKlien.Text
              

              Karakter “#” digunakan sebagai karakter pemisah untuk mempermudah proses parsing di aplikasi server.

              Selanjutnya di server tinggal di parsing menggunakan perintah Split.

              Private Sub wckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
                  Dim cmd         As String
                  Dim arrCmd()    As String
                  
                  On Error GoTo errHandle
                  
                  ' Grab the data from the specified Winsock object, and pass it to the parent.
                  Call wckServer(Index).GetData(cmd)
                  
                  ' contoh data yg diparsing
                  ' get_no_antrian#1
                  
                  ' di parsing menggunakan perintah Split
                  ' index 0 = get_no_antrian
                  ' index 1 = 1 -> nomor klien
                  
                  arrCmd = Split(cmd, "#")
                  
                  Select Case arrCmd(0)
                      Case "get_no_antrian"
                          Call send(Index, CStr(noAntrian))
                          
                          lblNoAntrian.Caption = "Klien " & arrCmd(1) & " / " & noAntrian
                          noAntrian = noAntrian + 1 ' naikkan counter nomor antrian
                          
                      Case Else
                          Call send(Index, "perintah tidak dikenal")
                  End Select
                  
                  Exit Sub
              errHandle:
                 Call wckServer(Index).Close
              End Sub
              
              • fireman
                August 19, 2013 at 4:43 pm

                mas, wonderfull,,,thanks y mas..moga2 selalu sehat dan lancar rezkinya…

                • August 20, 2013 at 10:44 am

                  Yuph sama2x
                  Amin

  24. samsung me
    November 27, 2013 at 8:07 pm

    mas, kalo gak usa pakai winsock, tp code yg biasa2 aja, bisa minta source codenya gak? karna saya masih pemula dan coba2 membuat tugas sistem antrian ini, tolong ya mas

    • December 23, 2013 at 2:02 pm

      D’oh mahasiswa pemalas, jadi males juga membantunya

  25. coco
    December 11, 2013 at 7:48 pm

    mas admin coding4ever terima kasih banyak yah sudah membantu tugas dari dosen saya….
    saya tinggal kembangkan untuk ditambahkan suara…
    semoga kebaikan mas admin selalu dibalas oleh allah swt … ๐Ÿ™‚
    terima kasih ya mas,…
    sukses selalu

    • December 23, 2013 at 1:52 pm

      Amin, sama2x om ๐Ÿ™‚

  26. gus adi
    March 11, 2014 at 12:07 pm

    mas admin. bisa gak bikin bikin antrian portable yang ada isi pemutar videonya komplit. sekalian harganya berapa. n jangan mahal mahal ya.

  27. gus adi
    March 11, 2014 at 12:09 pm

    nanti responya bales ke email saya ya mas admin. saya tunggu lo…

  1. April 16, 2014 at 9:14 am
Comments are closed.