데모가 막 끝났고, 나는 그 주제로 직접 갔다. 소켓 서버와 클라이언트 간의 통신을 시뮬레이션하기 위해 두 개의 스레드를 열고 데이터를 지정된 형식 메시지로 캡슐화하여
암호:
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;/*** import java.net.unknownhostexception;/***. */public class customData {public static void main (string args []) {// 서버 스레드 새 스레드 (new runnable () {@override public void run () {// 서버 소스 소켓 서버 = // 새로운 서버 컨트리를 위해 클라이언트를 대기하기 위해 클라이언트를 기다리고 있습니다. 첫 번째 바이트를 BYTE로 가져옵니다. [2] CRC32 = BYTESTOING (CRC); getcrc32 (bytes) {system.out.println (crc32 오른쪽!); integer.parseint (bytes [1]), 16; } 나머지 데이터를 가져 와서 데이터를 가져옵니다. inputStream.close ()} catch (ioexception e) {e.printstacktrace (); // 클라이언트 스레드 새 스레드 (new runnable () {@override public void run () {try {// 서버 소켓 소켓 연결 = 새로운 소켓 (getipaddress (), 9000); outputStream outputStream = socket.getOutputStream (); String Str = "Hellow World!" 0xff, data.length); } /***메시지 캡슐화 및 보내기*메시지 형식은 {총 메시지 길이 [2 바이트], CRC32 체크 코드 [4 바이트], VER 버전 정보 [1 바이트], CMD 명령 [1 바이트], 데이터 데이터 컨텐츠 [여러 바이트]}* /private static void Pack (출력 스트림, BYTE CMD, BYTE, int len) 위에서 언급했듯이 메시지는 형식 짧은 총계에 바이트를 추가합니다. // 출력 메시지 길이 out.write (ShortTobyte (Totalsize), 0, 2); // 점검 해야하는 필드 바이트 [] bytes = new Byte [1 + 1 + len]; int index = 0; 바이트 [index ++] = 0x05; // 버전 번호 (이것은 여기에 쓰여진 것입니다) 바이트 [index ++] = cmd; // cmd 명령 // (int i = 0; i <len; i ++) {bytes [index ++] = data [i]; } // ver, cmd 및 data에 대한 CRC32 검증 코드를 가져옵니다 (CRC32 알고리즘은 맨 아래에 있습니다. // 출력 CRC CHECK CODE OUT.WRITE (CRC32, 0, CRC32.length); // output ver, cmd, data out.write (bytes, 0, bytes.length); } catch (ioexception e) {e.printstacktrace (); }} / ** * 기본 IP * / private static string getipAddress () unknownhostException {inetAddress address = inetAddress.getLocalHost (); return address.gethostaddress (); } / ** * int to byte [] * / public static bd 바이트 [3] = (바이트) (값 >> 24); 바이트 [2] = (바이트) (값 >> 16); 바이트 [1] = (바이트) (값 >> 8); 바이트 [0] = (바이트) (값 >> 0); 반환 바이트; } / ** * BYTE에서 SHORT ~ BYTE [] * / public static byte [] shorttobyte (짧은 값) {byte [] bytes = new Byte [2]; 바이트 [1] = (바이트) (값 >> 8); 바이트 [0] = (바이트) (값 >> 0); 반환 바이트; } / *** 바이트에서 16 진수* / public static String bytetoHex (바이트 b) {int i = b & 0xff; return integer.tohexstring (i); } / ** * byte [] to int * / public static int bytestoint (byte [] bytes) {return (int) ((((bytes [3] & 0xff) << 24) | / *** byte [] to short* / public static short bytestoshort (byte [] bytes) {return (short) ((bytes [1] << 8) | bytes [0] & 0xff) / *** crc32 체크 코드* / public static int getcrc32 (byte [] bytes). 0x77073096, 0xee0e612c, 0x990951ba, 0x076DC419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x91e, 0xe0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e0d5e01e 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddddde4eb 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69 0xD56041E4, 0XA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0XA50AB56B, 0X35B5A8FA, 0x42B2986C, 0x42B2986C, 0XDBBBC9D6, 0XACBCF940, 0X32D86C9D6. 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xc8D75180, 0XBFD06116, 0x21B4F4B5, 0x56B3C423, 0XCFBA99, 0x21B4BDA50F 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0XB10BE924, 0x2F6F7C87, 0x58684C11, 0XC1611DAB, 0xB6662D3D, 0x76DC4190, 0x011DB7106, 0x98d220BC. 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6dbbb6dbbb6dbbb6a0db 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf557, 0x65b0d9, 0x65b0d9. 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4dbb30e2 0x4ADFA541, 0x3DD895D7, 0XA4D1C46D, 0XD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0XAD678846, 0xDA60B8D0, 0X44042D73, 0X3331DE5, 0xA0A442 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0XC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0X29D9D9D9D998 0xB0D09822, 0XC7D7A8B4, 0x59B33D17, 0X2EB40D81, 0xB7BD5C3B, 0XC0BA6CAD, 0XEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xead54739, 0xead54739 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d0799f1, 0x0a6a5aa8. 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da5a. 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0x38d8c2c4, 0x4fdff252, 0xD1937e. 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4699, 0xcb618eef, 0xcb618eefc3. 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45A92, 0x5cb36, 0x5505262f. 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e3636f, 0x026676. 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d2d2d2d2d2d2d2d2d3d3d3d3d3d3d3d3d3d3d3d3d3d2 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x110b5c, 0x8f659. 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0XA00AE278, 0XD70DD2EE, 0X4E048354, 0X3903B3C2, 0XA7672661, 0XD06016F7, 0X494D, 0X3E694D 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xbbe37, 0xc37, 0xc40bbe 0x5a05df1b, 0x2d02ef8d;실행 결과 :
Java 사용자 정의 프로토콜 패킷 캡슐화에서 CRC32 검증을 추가하는 위의 예는 내가 공유하는 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.