Nah setelah kita mengetahui format message ISO 8583, sekarang bagaimana meng-implementasikan-nya pada bahasa pemrograman Java ? Sebelum kita menulis kode, yang harus kita lakukan pertama kali yaitu adalah menyusun spesifikasi yang akan kita gunakan untuk berkomunikasi. Pada kenyataan-nya, spesifikasi ini sangat penting peranan-nya dan ada kemungkin tiap vendor mempunyai spesifikasi yang berbedaantara satu dengan yang lain. Sebagai catatan, perhatikan betul-betul spesifikasi yang sudah disepakati bersama. Dan sekarang, bagaimanakah cara membuat sebuah spesifikasi untuk message ISO 8583 dan implementasi-nya pada bahasa pemrograman Java akan kita bahas pada bab-bab dibawah ini :
Agar komunikasi antara server dan client dapat berjalan dengan sukses, maka diperlukan sebuah kesepakatan yang harus ditaati oleh kedua belah pihak. Beberapa persyaratan tersebut yaitu mencakup tentang :
Sampai disini proses pembuatan Helper Class sudah selesai dan siap untuk digunakan, sekarang mari saat-nya kita membuat sebuah implementasi server-nya
Implementasi server ini akan kita buat dengan menggunakan ServerSocket standart dari Java, jadi kita tidak memerlukan lagi tambahan library lain. Sekarang buatlah sebuah class baru dengan nama ServerISO dan simpanlah pada packageid.web.martinusadyh.iso8583.socket yang isinya kurang lebih seperti kode dibawah ini :
Sampai disini proses pembuatan implementasi Server ISO 8583 kita sudah selesai, sekarang mari kita lanjutkan dengan membuat implementasi untuk client-nya
Penulisan kode untuk implementasi client ini lebih mudah, karena kita hanya akan mencoba mengirimkan request message saja. Sekarang mari kita buat sebuah Java Class dengan nama ClientISO.java yang kode-nya seperti dibawah ini :
- Pembuatan Spesifikasi Message Network Management
- Pembuatan Aplikasi Server
- Pembuatan Aplikasi Client
- Testing
Pembuatan Spesifikasi Message Network Management
Agar komunikasi antara server dan client dapat berjalan dengan sukses, maka diperlukan sebuah kesepakatan yang harus ditaati oleh kedua belah pihak. Beberapa persyaratan tersebut yaitu mencakup tentang :
- Message Protokol, protokol yang akan digunakan dalam contoh kasus ini adalah ISO 8583:1993 yang ditandai dengan angka 1 (satu) pada MTI (Message Type Indicator).
- Connection Type, mode koneksi yang akan digunakan adalah mode connection-oriented dimana client membuka koneksi ke server sekali dan mengirimkan banyak message (connect once -> many transaction)
- Message System, untuk seluruh message yang dikirimkan ke server harus menggunakan 4 bit header sebagai penanda panjang message yang dikirimkan
Dan dibawah ini adalah format message Network Management Request/Response :
- NETWORK MANAGEMENT REQUEST
- Message Type Identifier : 1800
- Sender : Client
- Purpose : Request network management action to Server
- NETWORK MANAGEMENT RESPONSE
- Message Type Identifier : 1810
- Sender : Server
- Purpose : Response network management action for Client
- 000 = Successfull
- 001 = Timeout from Server
- 002 = Invalid Network Information Code
- 003 = Invalid Processing Code
Data Element | Name | Subfield | Type | Length | Format | Description |
---|---|---|---|---|---|---|
MTI | N | 4 | For request use 1800 | |||
1 | Bitmap | H | 16 | Use field = 3,7,11,12,13,48 and 70 | ||
3 | Processing Code | N | 6 | Default set to 000001 | ||
7 | Transmission Date and Time | N | 8 | yyyyMMdd | Transmission Date and Time | |
11 | System Trace Audit Number | N | 6 | zero-left-padding | Unique number from client | |
12 | Local time transaction | N | 6 | HHmmss | Transaction time from client | |
13 | Date local transaction | N | 4 | mmdd | Date transaction from client | |
48 | Additional Private Data | N | 3 | zero-left-padding | Lenght of Additional Private Data | |
48 | Additional Private Data | ClientID | N | 7 | zero-left-padding | Client identification number |
70 | Network Information Code | N | 3 | 001=sign-on, 002=sign-off, 003=echo-test |
Data Element | Name | Subfield | Type | Length | Format | Description |
---|---|---|---|---|---|---|
MTI | N | 4 | For request use 1800 | |||
1 | Bitmap | H | 16 | Use field = 3,7,11,12,13,39,48 and 70 | ||
3 | Processing Code | N | 6 | Default set to 000001 | ||
7 | Transmission Date and Time | N | 8 | yyyyMMdd | Transmission Date and Time | |
11 | System Trace Audit Number | N | 6 | zero-left-padding | Unique number from client | |
12 | Local time transaction | N | 6 | HHmmss | Transaction time from client | |
13 | Date local transaction | N | 4 | mmdd | Date transaction from client | |
39 | Response Code | N | 3 | Available Response Code : | ||
48 | Additional Private Data | N | 3 | zero-left-padding | Lenght of Additional Private Data | |
48 | Additional Private Data | ClientID | N | 7 | zero-left-padding | Client identification number |
70 | Network Information Code | N | 3 | 001=sign-on, 002=sign-off, 003=echo-test |
Pembuatan spesifikasi untuk message Network Management sudah selesai, sekarang mari kita implementasikan dengan membuat sebuah aplikasi server-nya dahulu.
Pembuatan Aplikasi Server
Sekarang buatlah sebuah project Java biasa pada NetBeans IDE dan berilah nama project tersebut contohnya Implementasi, dan buatlah sebuah package dahulu dengan nama id.web.martinusadyh.iso8583.helper. Didalam package yang telah kita buat, buatlah sebuah helper class dengan nama DecimalHexBinaryConverter.java yang mempunyai fungsi sebagai konverter ketika kita ingin menghitung nilai Bitmap yang kurang lebih seperti kode dibawah ini :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package id.web.martinusadyh.iso8583.helper; | |
public class DecimalHexBinaryConverter { | |
public static String decimalToHexa(Integer decimalNumber) { | |
return Integer.toHexString(decimalNumber); | |
} | |
public static String decimalToBinary(Integer decimalNumber) { | |
StringBuilder binaryNumber = new StringBuilder(); | |
StringBuilder sbBinary = new StringBuilder(); | |
String binaryString = Integer.toBinaryString(decimalNumber); | |
char[] binary = binaryString.toCharArray(); | |
int counter = 0; | |
// ambil dari index karakter terakhir | |
for (int i=binary.length-1; i>=0; i--) { | |
counter++; | |
sbBinary.append(binary[i]); | |
// reset counter ke nol jika berhasil mengambil 4 digit karakter | |
if (counter == 4) counter = 0; | |
} | |
// 4 adalah panjang karakter tiap blok di binary | |
// ex: dec [100] == binary [0110 0100] | |
for (int i=0; i<4-counter; i++) { | |
if (counter > 0) sbBinary.append("0"); | |
} | |
// sekarang dibalik | |
for (int i=sbBinary.length()-1; i>=0;i--) { | |
binaryNumber.append(sbBinary.toString().charAt(i)); | |
} | |
return binaryNumber.toString(); | |
} | |
public static Integer binaryToDecimal(String binaryNumber) { | |
return Integer.parseInt(binaryNumber, 2); | |
} | |
public static String binaryToHexa(String binaryNumber) { | |
return decimalToHexa(binaryToDecimal(binaryNumber)); | |
} | |
public static Integer hexaToDecimal(String hexaNumber) { | |
return Integer.parseInt(hexaNumber, 16); | |
} | |
public static String hexaToBinary(String hexaNumber) { | |
return decimalToBinary(hexaToDecimal(hexaNumber)); | |
} | |
} |
Setelah selesai membuat konverter dari HexaToBinary dan sebalik-nya, sekarang buatlah sebuah Helper Class lagi yang fungsinya kali ini lebih berkaitan dengan field-field yang terdapat dalam format ISO 8583seperti mencari panjang bitmap yang sebenar-nya, mencari data element yang aktif dalam sebuah message dan lain-lain. Sekarang buatlah sebuah Java Class dengan nama ISOUtil didalam packageid.web.martinusadyh.iso8583.helper yang isinya kurang lebih adalah sebagai berikut :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package id.web.martinusadyh.iso8583.helper; | |
public class ISOUtil { | |
/** Mencari panjang dari Bitmap 16 karakter atau 32 karakter, jika bit pertama | |
* nilai-nya == 1 (active/TRUE) maka secondary bitmap active dan otomatis | |
* panjang bitmap menjadi 32 karakter. | |
* @param originalMsg message asli ISO beserta dengan MTI-nya | |
* @return panjang bitmap yang harus di potong / diambil. | |
*/ | |
public static Integer findLengthOfBitmap(String originalMsg) { | |
// ambil 1 digit bitmap setelah MTI | |
String bitPertama = originalMsg.substring(4,5); | |
int panjangBitmap = 0; | |
// cek nilai binary-nya | |
if (DecimalHexBinaryConverter.hexaToBinary(bitPertama).substring(0, 1).equalsIgnoreCase("1")) { | |
panjangBitmap = 32; | |
} else { | |
panjangBitmap = 16; | |
} | |
return panjangBitmap; | |
} | |
public static String getHexaBitmapFromActiveDE(int[] activeDE) { | |
StringBuilder finalHexaBitmap = new StringBuilder(); | |
StringBuilder binaryBitmapForReply = new StringBuilder(); | |
boolean secondarBitmapActive = false; | |
int panjangBitmap = 16; | |
// pengecekan secondary bitmap | |
for (int i=0; i<activeDE.length;i++) { | |
if (activeDE[i] > 64) { | |
secondarBitmapActive = true; | |
panjangBitmap = 32; | |
} | |
} | |
// x4 untuk mendapatkan jumlah seluruh data elemen | |
panjangBitmap *= 4; | |
int counterBitmap=0; | |
String active = ""; | |
for (int i=0;i<panjangBitmap; i++) { | |
counterBitmap++; | |
active = "0"; | |
for (int j=0; j<activeDE.length; j++) { | |
if (counterBitmap == activeDE[j]) active = "1"; | |
} | |
binaryBitmapForReply.append(active); | |
} | |
// karena secondary bitmap active, bit pertama ganti jadi 1 | |
if (secondarBitmapActive) { | |
binaryBitmapForReply = new StringBuilder("1"+binaryBitmapForReply.toString().substring(1, binaryBitmapForReply.length())); | |
} | |
char[] binaryBitmapChar = binaryBitmapForReply.toString().toCharArray(); | |
int counter = 0; | |
StringBuilder sb = new StringBuilder(); | |
for (int i=0;i<binaryBitmapChar.length;i++) { | |
sb.append(binaryBitmapChar[i]); | |
counter++; | |
if (counter == 4) { | |
finalHexaBitmap.append(DecimalHexBinaryConverter.binaryToHexa(sb.toString())); | |
sb = new StringBuilder(); | |
counter=0; | |
} | |
} | |
return finalHexaBitmap.toString(); | |
} | |
public static String findMTI(String originalMsg) { | |
return originalMsg.substring(0, 4); | |
} | |
public static String findBinaryBitmapFromHexa(String hexaBitmap) { | |
StringBuilder binaryBitmap = new StringBuilder(); | |
char[] rawBitmap = hexaBitmap.toCharArray(); | |
for (int i=0; i<rawBitmap.length; i++) { | |
binaryBitmap.append(DecimalHexBinaryConverter.hexaToBinary(String.valueOf(rawBitmap[i]))); | |
} | |
return binaryBitmap.toString(); | |
} | |
public static String findActiveDE(String binaryBitmap) { | |
StringBuilder activeDE = new StringBuilder(); | |
char[] charBinaryBitmap = binaryBitmap.toCharArray(); | |
int counter = 0; | |
for (int i=0;i<charBinaryBitmap.length;i++) { | |
counter++; | |
if (String.valueOf(charBinaryBitmap[i]).equals("1")) activeDE.append(String.valueOf(counter) + ";"); | |
} | |
return activeDE.toString(); | |
} | |
} |

This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package id.web.martinusadyh.iso8583.socket; | |
import id.web.martinusadyh.iso8583.helper.ISOUtil; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.io.PrintWriter; | |
import java.net.ServerSocket; | |
import java.net.Socket; | |
import java.util.HashMap; | |
import java.util.Map; | |
/** | |
* | |
* @author Martinus Ady H <mrt.itnewbies@gmail.com> | |
*/ | |
public class ServerISO { | |
private static final Integer PORT = 12345; | |
private static final Map<String, Integer> mappingDENetworkMsg = new HashMap<String, Integer>(); | |
/* Method ini berfungsi untuk menginisialisasi data element dan panjang tiap | |
* -tiap data element yang aktif */ | |
private static void initMappingDENetworkRequest() { | |
/* [data-element] [panjang data element] */ | |
mappingDENetworkMsg.put("3", 6); | |
mappingDENetworkMsg.put("7", 8); | |
mappingDENetworkMsg.put("11", 6); | |
mappingDENetworkMsg.put("12", 6); | |
mappingDENetworkMsg.put("13", 4); | |
mappingDENetworkMsg.put("39", 3); | |
mappingDENetworkMsg.put("48", 999); | |
mappingDENetworkMsg.put("70", 3); | |
} | |
/** | |
* @param args the command line arguments | |
*/ | |
public static void main(String[] args) throws IOException { | |
initMappingDENetworkRequest(); | |
ServerSocket serverSocket = new ServerSocket(PORT); | |
System.out.println("Server siap menerima koneksi pada port ["+PORT+"]"); | |
Socket socket = serverSocket.accept(); | |
InputStreamReader inStreamReader = new InputStreamReader(socket.getInputStream()); | |
PrintWriter sendMsg = new PrintWriter(socket.getOutputStream()); | |
int data; | |
StringBuffer sb = new StringBuffer(); | |
int counter = 0; | |
// tambahan 4 karakter karena msg header adalah 4 digit msg length | |
int lengthOfMsg = 4; | |
while((data = inStreamReader.read()) != 0) { | |
counter++; | |
sb.append((char) data); | |
if (counter == 4) lengthOfMsg += Integer.valueOf(sb.toString()); | |
// klo panjang msg dari MTI sampai END OF MSG sama dengan nilai | |
// header maka lanjutkan ke method processingMsg(); | |
if (lengthOfMsg == sb.toString().length()) { | |
System.out.println("Rec. Msg ["+sb.toString()+"] len ["+sb.toString().length()+"]"); | |
processingMsg(sb.toString(), sendMsg); | |
} | |
} | |
} | |
/** Memproses msg yang dikirim oleh client berdasarkan nilai MTI. | |
* @param data request msg yang berisi [header 4byte][MTI][BITMAP][DATA ELEMENT] | |
* @param sendMsg object printWriter untuk menuliskan msg ke network stream | |
*/ | |
private static void processingMsg(String data, PrintWriter sendMsg) { | |
// msg.asli tanpa 4 digit msg.header | |
String origMsgWithoutMsgHeader = data.substring(4, data.length()); | |
// cek nilai MTI | |
if (ISOUtil.findMTI(origMsgWithoutMsgHeader).equalsIgnoreCase("1800")) { | |
handleNetworkMsg(origMsgWithoutMsgHeader, sendMsg); | |
} | |
} | |
/** Method ini akan memproses network management request dan akan menambahkan | |
* 1 data element yaitu data element 39 (response code) 000 ke client/sender | |
* @param networkMsg request msg yang berisi [header 4byte][MTI][BITMAP][DATA ELEMENT] | |
* @param sendMsg object printWriter untuk menuliskan msg ke network stream | |
*/ | |
private static void handleNetworkMsg(String networkMsg, PrintWriter sendMsg) { | |
int panjangBitmap = ISOUtil.findLengthOfBitmap(networkMsg); | |
String hexaBitmap = networkMsg.substring(4, 4+panjangBitmap); | |
// hitung bitmap | |
String binaryBitmap = ISOUtil.findBinaryBitmapFromHexa(hexaBitmap); | |
String[] activeDE = ISOUtil.findActiveDE(binaryBitmap).split(";"); | |
StringBuilder networkResp = new StringBuilder(); | |
// setting MTI untuk reply network request | |
networkResp.append("1810"); | |
// untuk reply, DE yang aktif adalah DE[3,7,11,12,13,39,48 dan 70] | |
String bitmapReply = ISOUtil.getHexaBitmapFromActiveDE(new int[] {3,7,11,12,13,39,48, 70}); | |
networkResp.append(bitmapReply); | |
// index msg dimulai dr (4 digit MTI+panjang bitmap = index DE ke 3) | |
int startIndexMsg = 4+ISOUtil.findLengthOfBitmap(networkMsg); | |
int nextIndex = startIndexMsg; | |
String sisaDefaultDE = ""; | |
// ambil nilai DE yang sama dulu | |
for (int i=0;i<activeDE.length;i++) { | |
// ambil bit ke 3 | |
if (activeDE[i].equalsIgnoreCase("3")) { | |
nextIndex += mappingDENetworkMsg.get(activeDE[i]); | |
networkResp.append(networkMsg.substring(startIndexMsg, nextIndex)); | |
debugMessage(3, networkMsg.substring(startIndexMsg, nextIndex)); | |
} else if(activeDE[i].equalsIgnoreCase("7")) { | |
startIndexMsg = nextIndex; | |
nextIndex += mappingDENetworkMsg.get(activeDE[i]); | |
networkResp.append(networkMsg.substring(startIndexMsg, nextIndex)); | |
debugMessage(7, networkMsg.substring(startIndexMsg, nextIndex)); | |
} else if(activeDE[i].equalsIgnoreCase("11")) { | |
startIndexMsg = nextIndex; | |
nextIndex += mappingDENetworkMsg.get(activeDE[i]); | |
networkResp.append(networkMsg.substring(startIndexMsg, nextIndex)); | |
debugMessage(11, networkMsg.substring(startIndexMsg, nextIndex)); | |
} else if(activeDE[i].equalsIgnoreCase("12")) { | |
startIndexMsg = nextIndex; | |
nextIndex += mappingDENetworkMsg.get(activeDE[i]); | |
networkResp.append(networkMsg.substring(startIndexMsg, nextIndex)); | |
debugMessage(12, networkMsg.substring(startIndexMsg, nextIndex)); | |
} else if(activeDE[i].equalsIgnoreCase("13")) { | |
startIndexMsg = nextIndex; | |
nextIndex += mappingDENetworkMsg.get(activeDE[i]); | |
networkResp.append(networkMsg.substring(startIndexMsg, nextIndex)); | |
debugMessage(13, networkMsg.substring(startIndexMsg, nextIndex)); | |
} else if(activeDE[i].equalsIgnoreCase("48")) { | |
startIndexMsg = nextIndex; | |
// ambil dulu var.len utk DE 48 | |
int varLen = Integer.valueOf(networkMsg.substring(startIndexMsg, (startIndexMsg+3))); | |
// 3 digit utk variabel len | |
varLen += 3; | |
nextIndex += varLen; | |
sisaDefaultDE += networkMsg.substring(startIndexMsg, nextIndex); | |
debugMessage(48, networkMsg.substring(startIndexMsg, nextIndex)); | |
} else if(activeDE[i].equalsIgnoreCase("70")) { | |
startIndexMsg = nextIndex; | |
nextIndex += mappingDENetworkMsg.get(activeDE[i]); | |
sisaDefaultDE += networkMsg.substring(startIndexMsg, nextIndex); | |
debugMessage(70, networkMsg.substring(startIndexMsg, nextIndex)); | |
} | |
} | |
// kasih response kode 39 success | |
networkResp.append("000"); | |
// tambahkan sisa default DE | |
networkResp.append(sisaDefaultDE); | |
// tambahkan length 4 digit utk msg.header | |
String msgHeader = ""; | |
if (networkResp.length() < 10) msgHeader = "000" + networkResp.length(); | |
if (networkResp.length() < 100 && networkResp.length() >= 10) msgHeader = "00" + networkResp.length(); | |
if (networkResp.length() < 1000 && networkResp.length() >= 100) msgHeader = "0" + networkResp.length(); | |
if (networkResp.length() >= 1000) msgHeader = String.valueOf(networkResp.length()); | |
String finalMsg = msgHeader + networkResp.toString(); | |
// send to client | |
sendMsg.print(finalMsg); | |
sendMsg.flush(); | |
} | |
private static void debugMessage(Integer fieldNo, String msg) { | |
System.out.println("["+fieldNo+"] ["+msg+"]"); | |
} | |
} |
Sampai disini proses pembuatan implementasi Server ISO 8583 kita sudah selesai, sekarang mari kita lanjutkan dengan membuat implementasi untuk client-nya

Pembuatan Aplikasi Client
Penulisan kode untuk implementasi client ini lebih mudah, karena kita hanya akan mencoba mengirimkan request message saja. Sekarang mari kita buat sebuah Java Class dengan nama ClientISO.java yang kode-nya seperti dibawah ini :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package id.web.martinusadyh.iso8583.socket; | |
import id.web.martinusadyh.iso8583.helper.ISOUtil; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.io.PrintWriter; | |
import java.net.Socket; | |
import java.net.UnknownHostException; | |
import java.text.SimpleDateFormat; | |
import java.util.Date; | |
/** | |
* | |
* @author Martinus Ady H <mrt.itnewbies@gmail.com> | |
*/ | |
public class ClientISO { | |
private final static Integer PORT_SERVER = 12345; | |
/** | |
* @param args the command line arguments | |
*/ | |
public static void main(String[] args) throws UnknownHostException, IOException { | |
Socket clientSocket = new Socket("localhost", PORT_SERVER); | |
String networkRequest = buildNetworkReqMessage(); | |
PrintWriter outgoing = new PrintWriter(clientSocket.getOutputStream()); | |
InputStreamReader incoming = new InputStreamReader(clientSocket.getInputStream()); | |
outgoing.print(networkRequest); | |
outgoing.flush(); | |
int data; | |
StringBuffer sb = new StringBuffer(); | |
int counter = 0; | |
// tambahan 4 karakter karena msg header adalah 4 digit msg length | |
int lengthOfMsg = 4; | |
while((data = incoming.read()) != 0) { | |
counter++; | |
sb.append((char) data); | |
if (counter == 4) lengthOfMsg += Integer.valueOf(sb.toString()); | |
// klo panjang msg dari MTI sampai END OF MSG sama dengan nilai | |
// header maka lanjutkan ke method processingMsg(); | |
if (lengthOfMsg == sb.toString().length()) { | |
System.out.println("Rec. Msg ["+sb.toString()+"] len ["+sb.toString().length()+"]"); | |
} | |
} | |
outgoing.close(); | |
incoming.close(); | |
clientSocket.close(); | |
} | |
private static String buildNetworkReqMessage() { | |
StringBuilder networkReq = new StringBuilder(); | |
// MTI 1800 | |
networkReq.append("1800"); | |
// untuk request, DE yang aktif adalah DE[3,7,11,12,13,48 dan 70] | |
String bitmapReq = ISOUtil.getHexaBitmapFromActiveDE(new int[] {3,7,11,12,13,48,70}); | |
networkReq.append(bitmapReq); | |
// DE 3 processing code | |
networkReq.append("000001"); | |
// DE 7 transmission date and time | |
networkReq.append(new SimpleDateFormat("yyyyMMdd").format(new Date())); | |
// DE 11 system trace audit number | |
networkReq.append("000001"); | |
// DE 12 local time transaction | |
networkReq.append(new SimpleDateFormat("HHmmss").format(new Date())); | |
// DE 13 local time transaction | |
networkReq.append(new SimpleDateFormat("MMdd").format(new Date())); | |
// DE 48 Additional Private Data | |
final String clientID = "CLNT001"; | |
// length de 48 | |
String lengthBit48 = ""; | |
if (clientID.length() < 10) lengthBit48 = "00" + clientID.length(); | |
if (clientID.length() < 100 && clientID.length() >= 10) lengthBit48 = "0" + clientID.length(); | |
if (clientID.length() == 100) lengthBit48 = String.valueOf(clientID.length()); | |
networkReq.append(lengthBit48); | |
networkReq.append(clientID); | |
// DE 70 Network Information Code | |
networkReq.append("001"); | |
// tambahkan 4 digit length of msg sbg header | |
String msgHeader = ""; | |
if (networkReq.toString().length() < 10) msgHeader = "000" + networkReq.toString().length(); | |
if (networkReq.toString().length() < 100 && networkReq.toString().length() >= 10) msgHeader = "00" + networkReq.toString().length(); | |
if (networkReq.toString().length() < 1000 && networkReq.toString().length() >= 100) msgHeader = "0" + networkReq.toString().length(); | |
if (networkReq.toString().length() >= 1000) msgHeader = String.valueOf(networkReq.toString().length()); | |
StringBuilder finalNetworkReqMsg = new StringBuilder(); | |
finalNetworkReqMsg.append(msgHeader); | |
finalNetworkReqMsg.append(networkReq.toString()); | |
return finalNetworkReqMsg.toString(); | |
} | |
} |
Jika sudah, sekarang lakukan-lah proses Clean and Build pada NetBeans dengan menekan kombinasi tombol SHIFT+F11 dan harusnya tidak ada pesan kesalahan yang akan ditimbulkan 

Testing
Pembuatan aplikasi server dan client sudah selesai dilakukan, sekarang langkah terakhir yang harus kita lakukan yaitu adalah mencoba untuk menjalankan kedua aplikasi tersebut. Sekarang jalankanlah dahulu aplikasi server-nya dengan cara klik kanan pada file
ServerISO.java
kemudian pilihlah Run Dan jika tidak ada pesan kesalahan, maka pada pallete output NetBeans akan muncul tulisan seperti dibawah ini :run: Server siap menerima koneksi pada port [12345]
Jika sudah menjumpai tampilan seperti diatas, sekarang jalankan-lah file
ClientISO.java
dengan cara klik kanan kemudian pilih menu Run. Jika tidak pesan kesalahan, maka pada sisi client akan muncul tulisan seperti dibawah ini :run: Req. Msg [00791800a2380000000100000400000000000000000001201011080000012356161108007CLNT001001] Rec. Msg [00821810a2380000020100000400000000000000000001201011080000012356161108000007CLNT001001] len [86]
Dan kita juga bisa melihat respon yang diberikan server ketika terjadi request dari client dengan melihat tampilan output-nya yang kurang lebih seperti dibawah ini :
run: Server siap menerima koneksi pada port [12345] Rec. Msg [00791800a2380000000100000400000000000000000001201011080000012356161108007CLNT001001] len [83] [3] [000001] [7] [20101108] [11] [000001] [12] [235616] [13] [1108] [48] [007CLNT001] [70] [001] Res. Msg [00821810a2380000020100000400000000000000000001201011080000012356161108000007CLNT001001]
Sampai disini, proses request / response telah terjadi dengan baik antara sisi server dan sisi client
Bagaimana ? tidak susah bukan ? Nah pada bab selanjut-nya, kita akan membahas salah satu library di Java yang sudah meng-otomatisasikan proses-proses yang telah kita lakukan secara manual diatas 


WHat is that 0079 and 0082 infront of the MTI?
ReplyDeletefor identification length of the message
DeleteMas saya udah coba jalankan scripnya tapi kenapa Res. Msg nya ngga keluar ya.? Maaf mas newbe. Hehe
ReplyDelete5 Ways to Add Titanium In a Bucket - TITanium-Arts.com
ReplyDeleteTitanium-Arts.com titanium men\'s wedding band is a website titanium curling wand devoted titanium solvent trap monocore to titanium earrings all used ford edge titanium the benefits of building a bucket. Tittler's is a simple tool that comes in handy whenever you