The demo just finished, I went directly to the topic. I opened two threads to simulate communication between the Socket server and the client, and encapsulated the data into a specified format message to send
Code:
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;import java.net.UnknownHostException;/** * Created by SiKang on 2016/4/29. */public class CustomData { public static void main(String args[]) { //Server thread new Thread(new Runnable() { @Override public void run() { try { //Open the server Socket ServerSocket server = new ServerSocket(9000); //Waiting for the client to connect Socket socket = server.accept(); InputStream inputStream = socket.getInputStream(); //First get the first two bytes as the message length byte[] lenBytes = new byte[2]; inputStream.read(lenBytes); short length = bytesToShort(lenBytes); System.out.println("length: " + length); //Then get the next four bytes crc32 check code byte[] crc = new byte[4]; inputStream.read(crc); int crc32 = bytesToInt(crc); //Get the remaining fields ver, cmd, data byte[] bytes = new byte[length - 2 - 4]; inputStream.read(bytes); //Get the new Crc32 check code based on the obtained bytes to verify whether the data is complete (you can read less one less when reading bytes to see if it can pass) if (crc32 == getCRC32(bytes)) { System.out.println("Crc32 Right!"); }else{ System.out.println("Crc32 Error!"); return; } //Take out ver cmd int ver = Integer.parseInt(byteToHex(bytes[0]), 16); int cmd = Integer.parseInt(byteToHex(bytes[1]), 16); //See if ver is sending 0x05 if (ver == 0x05) { System.out.println("ver: 0x05"); } //Care whether cmd is sending 0xff if (cmd == 0xff) { System.out.println("cmd: 0xff"); } //Get the remaining data bytes and take out the data data int datalen = length - 2 - 4 - 1 - 1; byte[] data = new byte[datalen]; int index = 1; for (int i = 0; i < datalen; i++) { data[i] = bytes[++index]; } String str = new String(data); System.out.println("data: " + str); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }).start(); //Client thread new Thread(new Runnable() { @Override public void run() { try { //Connect the server Socket socket = new Socket(getIpAddress(), 9000); OutputStream outputStream = socket.getOutputStream(); String str = "Hellow World!"; byte[] data = str.getBytes(); //Send packet(outputStream, (byte) 0xff, data, data.length); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }).start(); } /** *Encapsulate and send messages*The message format is {Total message length [2 bytes], Crc32 check code [4 bytes], ver version information [1 byte], cmd instruction [1 byte], data data content [several bytes]} */ private static void pack(OutputStream out, byte cmd, byte[] data, int len) { try { //First get the total length of the message, as mentioned above, add the bytes to the format short totalSize = (short) (2 + 4 + 1 + 1 + len); //Output message length out.write(shortToByte(totalSize), 0, 2); //The field that needs to be checked byte[] bytes = new byte[1 + 1 + len]; int index = 0; bytes[index++] = 0x05;// Version number (this is written dead here) bytes[index++] = cmd;//cmd instruction//Data content for (int i = 0; i < len; i++) { bytes[index++] = data[i]; } //Get the crc32 verification code for ver, cmd, and data (Crc32 algorithm is at the bottom, found online...) byte[] crc32 = intToBytes(getCRC32(bytes)); //Output crc check code out.write(crc32, 0, crc32.length); //Output ver, cmd, data out.write(bytes, 0, bytes.length); } catch (IOException e) { e.printStackTrace(); } } /** * Get the native IP */ private static String getIpAddress() throws UnknownHostException { InetAddress address = InetAddress.getLocalHost(); return address.getHostAddress(); } /** * int to byte[] */ public static byte[] intToBytes(int value) { byte[] bytes = new byte[4]; bytes[3] = (byte) (value >> 24); bytes[2] = (byte) (value >> 16); bytes[1] = (byte) (value >> 8); bytes[0] = (byte) (value >> 0); return bytes; } /** * short to byte[] */ public static byte[] shortToByte(short value) { byte[] bytes = new byte[2]; bytes[1] = (byte) (value >> 8); bytes[0] = (byte) (value >> 0); return bytes; } /** * byte to hexadecimal*/ public static String byteToHex(byte b) { int i = b & 0xFF; return Integer.toHexString(i); } /** * byte[] to int */ public static int bytesToInt(byte[] bytes) { return (int) (((((bytes[3] & 0xff) << 24) | ((bytes[2] & 0xff) << 16) | ((bytes[1] & 0xff) << 8) | ((bytes[0] & 0xff) << 0))); } /** * byte[] to short */ public static short bytesToShort(byte[] bytes) { return (short) (((bytes[1] << 8) | bytes[0] & 0xff)); } /** * Get the CRC32 check code*/ public static int getCRC32(byte[] bytes) { int[] table = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, }; int crc = 0xffffffffff; for (byte b : bytes) { crc = (crc >>> 8 ^ table[(crc ^ b) & 0xff]); } crc = crc ^ 0xffffffff; return crc; }}Running results:
The above example of adding Crc32 verification in Java custom protocol packet encapsulation is all the content I share with you. I hope you can give you a reference and I hope you can support Wulin.com more.