การสาธิตเพิ่งเสร็จสิ้นฉันไปที่หัวข้อโดยตรง ฉันเปิดสองเธรดเพื่อจำลองการสื่อสารระหว่างซ็อกเก็ตเซิร์ฟเวอร์และไคลเอนต์และห่อหุ้มข้อมูลลงในข้อความรูปแบบที่ระบุเพื่อส่ง
รหัส:
นำเข้า java.io.ioexception; นำเข้า java.io.Inputstream; นำเข้า java.io.OutputStream; นำเข้า java.net.inetaddress; นำเข้า java.net.serversocket นำเข้า java.net.socket; */คลาสสาธารณะ customdata {โมฆะคงที่สาธารณะหลัก (สตริง args []) {// เธรดเซิร์ฟเวอร์เธรดใหม่ (ใหม่ runnable () {@Override โมฆะสาธารณะเรียกใช้ () {ลอง {// เปิดเซิร์ฟเวอร์เซิร์ฟเวอร์เซิร์ฟเวอร์ = serverstream (9000); // ครั้งแรกรับสองไบต์เป็นไบต์ความยาวข้อความ [] lenbytes = byte ใหม่ [2]; crc32 = bytestoint (CRC); getCRC32 (ไบต์)) {System.out.println ("Crc32 ถูกต้อง!"); integer.parseint (bytetohex (ไบต์ [1]), 16); }/ รับข้อมูลที่เหลืออยู่และนำข้อมูลข้อมูล int datalen = ความยาว - 2 - 4 - 1 - 1; InputStream.close (); // เธรดไคลเอ็นต์ใหม่เธรดใหม่ (ใหม่ runnable () {@Override โมฆะสาธารณะเรียกใช้ () {ลอง {// เชื่อมต่อซ็อกเก็ตซ็อกเก็ตเซิร์ฟเวอร์ = ซ็อกเก็ตใหม่ (getipaddress (), 9000); outputstream outputstream = socket.getOutputStream () str = "Hellow World! 0xff, data.length); outputstream.flush (); } /***encapsulate และส่งข้อความ*รูปแบบข้อความคือ {ความยาวข้อความทั้งหมด [2 bytes], CRC32 รหัสตรวจสอบ [4 ไบต์], ข้อมูลเวอร์ชัน ver [1 ไบต์], คำสั่ง CMD [1 ไบต์], ข้อมูลข้อมูล ข้อความดังที่ได้กล่าวไว้ข้างต้นเพิ่มไบต์ลงในรูปแบบ short totalsize = (สั้น) (2 + 4 + 1 + 1 + len); // ความยาวข้อความเอาต์พุต Out.Write (shorttobyte (รวม), 0, 2); // ฟิลด์ที่ต้องตรวจสอบไบต์ [] ไบต์ = ไบต์ใหม่ [1 + 1 + len]; ดัชนี int = 0; ไบต์ [ดัชนี ++] = 0x05; // หมายเลขเวอร์ชัน (สิ่งนี้เขียนถึงตายที่นี่) ไบต์ [ดัชนี ++] = cmd; // คำสั่ง cmd // เนื้อหาข้อมูลสำหรับ (int i = 0; i <len; i ++) {bytes [index ++] = data [i]; } // รับรหัสการตรวจสอบ CRC32 สำหรับ VER, CMD และ DATA (อัลกอริทึม CRC32 อยู่ที่ด้านล่างพบออนไลน์ ... ) ไบต์ [] CRC32 = intToBytes (getCRC32 (ไบต์)); // เอาท์พุท CRC ตรวจสอบรหัส OUT.WRITE (CRC32, 0, CRC32.Length); // output ver, cmd, data out.write (ไบต์, 0, bytes.length); } catch (ioexception e) {e.printstacktrace (); }} / ** * รับ IP * / สตริงคงที่ส่วนตัว getIpAddress () พ่น unknownhostexception {address inetaddress = inetaddress.getLocalhost (); return address.getHostaddress (); } / ** * int to byte [] * / public Static byte [] inttobytes (ค่า int) {byte [] bytes = byte ใหม่ [4]; ไบต์ [3] = (ไบต์) (ค่า >> 24); ไบต์ [2] = (ไบต์) (ค่า >> 16); ไบต์ [1] = (ไบต์) (ค่า >> 8); ไบต์ [0] = (ไบต์) (ค่า >> 0); ไบต์กลับ; } / ** * สั้นถึงไบต์ [] * / ไบต์คงที่สาธารณะ [] shorttobyte (ค่าสั้น) {byte [] bytes = byte ใหม่ [2]; ไบต์ [1] = (ไบต์) (ค่า >> 8); ไบต์ [0] = (ไบต์) (ค่า >> 0); ไบต์กลับ; } / *** ไบต์ถึง hexadecimal* / สตริงคงที่สาธารณะ bytetohex (ไบต์ b) {int i = b & 0xff; return integer.tohexstring (i); } / ** * byte [] ถึง int * / สาธารณะคงที่ int bytestoint (byte [] bytes) {return (int) (((((ไบต์ [3] & 0xff) << 24) | (ไบต์ [2] & 0xff) << 16) | (bytes [1] & 0xff) / *** byte [] ถึงสั้น* / สาธารณะคงที่ bytestoshort (byte [] bytes) {return (สั้น) ((ไบต์ [1] << 8) | ไบต์ [0] & 0xff)); 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x84be41de 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42B2986C 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab5551ce 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309fr9d 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085a6, 0xff0f6a70, 0x6606063bca 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02 0x5a05df1b, 0x2d02ef8d,};ผลการทำงาน:
ตัวอย่างข้างต้นของการเพิ่มการตรวจสอบ CRC32 ใน Java Custom Protocol Packet Encapsulation คือเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น