📄 packetfactory.java
字号:
* </thead> * <tbody> * <tr> * <td>Protocol</td> * <td>1</td> * <td>0xE3</td> * <td>-</td> * </tr> * <tr> * <td>Size</td> * <td>4</td> * <td>-</td> * <td>The size of the message in bytes not including the header and size fields</td> * </tr> * <tr> * <td>Type</td> * <td>1</td> * <td>0x01</td> * <td>The value of the OP HELLO opcode</td> * </tr> * <tr> * <td>User Hash size</td> * <td>1</td> * <td>16</td> * <td>The size of the user hash field</td> * </tr> * <tr> * <td>User Hash</td> * <td>16</td> * <td> </td> * <td>TBD</td> * </tr> * <tr> * <td>Client ID</td> * <td>4</td> * <td>0</td> * <td>TBD</td> * </tr> * <tr> * <td>TCP Port</td> * <td>2</td> * <td>4662</td> * <td>The TCP port used by the client, configurable</td> * </tr> * <tr> * <td>Tag Count</td> * <td>4</td> * <td>4</td> * <td>The number of tags following in the message</td> * </tr> * <tr> * <td>Tag list</td> * <td>varies</td> * <td>NA</td> * <td>A list of tags specifying remote client’s properties * </td> * </tr> * <tr> * <td>Server IP</td> * <td>4</td> * <td>NA</td> * <td>The IP of the server to which the client is connected * </td> * </tr> * <tr> * <td>Server TCP Port * </td> * <td>2</td> * <td>NA</td> * <td>The TCP port on which the server listens</td> * </tr> * </tbody> * </table> * </table> */ public static Packet getPeerHelloPacket(UserHash userHash,ClientID clientID,int myPort, byte[] serverIP,int serverPort,String userName){ byte[] tagUserName=TagFactory.getStringTag(userName, TAG_NAME_NAME).getData(); byte[] tagMiscOptions1=TagFactory.getDWORDTag(0, TAG_NAME_MISC_OPTIONS1).getData(); byte[] tagMiscOptions2=TagFactory.getDWORDTag(0, TAG_NAME_MISC_OPTIONS2).getData(); byte[] tagProtocolVersion=TagFactory.getDWORDTag(ProtocolVersion,TAG_NAME_PROTOCOLVERSION).getData();//Version tag byte[] tageMuleVer=TagFactory.getDWORDTag(SoftwareVersion, TAG_NAME_CLIENTVER).getData(); byte[] tagUDPPort = TagFactory.getDWORDTag(ConfigurationManagerFactory.getInstance().getUDP(), TAG_NAME_UDP_PORT_PEER).getData(); Packet packet=new StandardPacket(1+16+4+2+4+tagUserName.length+tagMiscOptions1.length+tagMiscOptions2.length+tagProtocolVersion.length+tageMuleVer.length+tagUDPPort.length+4+2); packet.setCommand(OP_PEERHELLO);//hello packet.insertData((byte)16);//Insert length of user Hash packet.insertData(userHash.getUserHash());//insert user hash if (clientID == null) packet.insertData(new byte[]{0,0,0,0});//insert user ID else packet.insertData(clientID.getClientID());//insert user ID packet.insertData((short)myPort);//insert my active port packet.insertData((int)6);//insert tag count packet.insertData(tagUserName);//insert tag : user name packet.insertData(tagMiscOptions1); packet.insertData(tagMiscOptions2); packet.insertData(tagProtocolVersion); packet.insertData(tageMuleVer); packet.insertData(tagUDPPort); if (serverIP==null) packet.insertData(new byte[]{0,0,0,0}); else packet.insertData((serverIP)); packet.insertData((short)serverPort); return packet; } /** * Peer hello answer packet. * <table cellspacing="0" border="1" cellpadding="0"> * <thead> * <tr> * <th>Name</th> * <th>Size in bytes</th> * <th>Default value</th> * <th>Comment</th> * </tr> * </thead> * <tbody> * <tr> * <td>Protocol</td> * <td>1</td> * <td>0xE3</td> * <td>-</td> * </tr> * <tr> * <td>Size</td> * <td>4</td> * <td>-</td> * <td>The size of the message in bytes not including the header and size fields</td> * </tr> * <tr> * <td>Type</td> * <td>1</td> * <td>0x4C</td> * <td>The value of the OP HELLOANSWER opcode</td> * </tr> * <tr> * <td>Hello fields</td> * <td> </td> * <td> </td> * <td>The same fields as in the hello message starting with the user hash</td> * </tr> * </tbody> * </table> * */ public static Packet getPeerHelloAnswerPacket(UserHash userHash,ClientID clientID, int myPort,String userName,byte[] serverIP, int serverPort){ byte[] tagUserName=TagFactory.getStringTag(userName, TAG_NAME_NAME).getData(); byte[] tagMiscOptions1=TagFactory.getDWORDTag(0, TAG_NAME_MISC_OPTIONS1).getData(); byte[] tagMiscOptions2=TagFactory.getDWORDTag(0, TAG_NAME_MISC_OPTIONS2).getData(); byte[] tagProtocolVersion=TagFactory.getDWORDTag(ProtocolVersion,TAG_NAME_PROTOCOLVERSION).getData();//Version tag byte[] tageMuleVer=TagFactory.getDWORDTag(SoftwareVersion, TAG_NAME_CLIENTVER).getData(); byte[] tagUDPPort = TagFactory.getDWORDTag(ConfigurationManagerFactory.getInstance().getUDP(), TAG_NAME_UDP_PORT_PEER).getData(); Packet packet=new StandardPacket(1+1+16+4+2+4+4+2+tagUserName.length+2+tagMiscOptions1.length+tagMiscOptions2.length+tagProtocolVersion.length+tageMuleVer.length+4+2); packet.setCommand(OP_PEERHELLOANSWER);//hello answer tag packet.insertData(userHash.getUserHash());//insert user hash if (clientID==null) packet.insertData(new byte[]{0,0,0,0}); else packet.insertData(clientID.getClientID());//insert user ID packet.insertData((short)myPort);//insert my active port packet.insertData((int)6);//insert tag count packet.insertData(tagUserName);//insert tag : user name packet.insertData(tagMiscOptions1);//client flags packet.insertData(tagMiscOptions2); packet.insertData(tagProtocolVersion); packet.insertData(tagUDPPort); //packet.insertPacketData(tagPort); packet.insertData(tageMuleVer); if (serverIP!=null) packet.insertData(serverIP); else packet.insertData(new byte[]{0,0,0,0});//Server IP if (serverPort!=0) packet.insertData((short)serverPort); else packet.insertData((short)0);//Server port return packet; } /** * Peer chat message. * <table cellspacing="0" border="1" cellpadding="0"> * <thead> * <tr> * <th>Name</th> * <th>Size in bytes</th> * <th>Default value</th> * <th>Comment</th> * </tr> * </thead> * <tbody> * <tr> * <td>Protocol</td> * <td>1</td> * <td>0xE3</td> * <td>-</td> * </tr> * <tr> * <td>Size</td> * <td>4</td> * <td>-</td> * <td>The size of the message in bytes not including * the header and size fields * </td> * </tr> * <tr> * <td>Type</td> * <td>1</td> * <td>0x4E</td> * <td>The value of the OP_MESSAGE opcode</td> * </tr> * <tr> * <td>Length</td> * <td>2</td> * <td> NA</td> * <td>The length of the message</td> * </tr> * <tr> * <td>Message</td> * <td>Varies</td> * <td>NA</td> * <td>The actual message * </td> * </tr> * </tbody> * </table> **/ public static Packet getMessagePacket(String message){ Packet packet = new StandardPacket(2+message.length()); packet.setCommand(OP_MESSAGE); packet.insertData(Convert.intToShort(message.length())); packet.insertData(message.getBytes()); return packet; } /** * Get File Request packet. * <table cellspacing="0" border="1" cellpadding="0"> * <thead> * <tr> * <th>Name</th> * <th>Size in bytes</th> * <th>Default value</th> * <th>Comment</th> * </tr> * </thead> * <tbody> * <tr> * <td>Protocol</td> * <td>1</td> * <td>0xE3</td> * <td>-</td> * </tr> * <tr> * <td>Size</td> * <td>4</td> * <td>-</td> * <td>The size of the message in bytes not including * the header and size fields * </td> * </tr> * <tr> * <td>Type</td> * <td>1</td> * <td>0x58</td> * <td>The value of the OP FILEREQUEST opcode * </td> * </tr> * <tr> * <td>File ID</td> * <td>16</td> * <td>NA</td> * <td>Unique file ID</td> * </tr> * <tr> * <td>Part Status</td> * <td>3</td> * <td>NA</td> * <td>Optional, sent if the extended request version * indicated in the eMule info message is greater * than zero. The file significance is explained in * this section * </td> * </tr> * <tr> * <td>Source count</td> * <td>2</td> * <td>NA</td> * <td>Optional, sent if the extended request version * indicated in the eMule info message is greater * than one. Indicated the current number of * sources for this file * </td> * </tr> * </tbody> * </table> * */ public static Packet getFileRequestPacket(FileHash fileHash){ Packet packet=new StandardPacket(16); packet.setCommand(OP_FILEREQUEST); packet.insertData(fileHash.getHash()); return packet; } /** * Get requested file ID, this packet must be used with FileRequest packet. * @param fileHash file ID * @return requested file ID packet * <table cellspacing="0" border="1" cellpadding="0"> * <thead> * <tr> * <th>Name</th> * <th>Size in bytes</th> * <th>Default value</th> * <th>Comment</th> * </tr> * </thead> * <tbody> * <tr> * <td>Protocol</td> * <td>1</td> * <td>0xE3</td> * <td>-</td> * </tr> * <tr> * <td>Size</td> * <td>4</td> * <td>-</td> * <td>The size of the message in bytes not including * the header and size fields * </td> * </tr> * <tr> * <td>Type</td> * <td>1</td> * <td>0x4F</td> * <td>The value of the OP SETREQFILEID opcode</td> * </tr> * <tr> * <td>File ID</td> * <td>16</td> * <td>NA</td> * <td>The ID of the requested file</td> * </tr> * </tbody> * </table> */ public static Packet getFileStatusRequestPacket(FileHash fileHash){ Packet packet=new StandardPacket(16); packet.setCommand(OP_FILESTATREQ); packet.insertData(fileHash.getHash()); return packet; } /** * Start upload request for file. * @param fileHash file hash * @return eDonkey packet * <table cellspacing="0" border="1" cellpadding="0"> * <thead> * <tr> * <th>Name</th> * <th>Size in bytes</th> * <th>Default value</th> * <th>Comment</th> * </tr> * </thead> * <tbody> * <tr> * <td>Protocol</td> * <td>1</td> * <td>0xE3</td> * <td>-</td> * </tr> * <tr> * <td>Size</td> * <td>4</td> * <td>-</td> * <td>The size of the message in bytes not including * the header and size fields * </td> * </tr> * <tr> * <td>Type</td> * <td>1</td> * <td>0x54</td> * <td>The value of the OP_ STARTUPLOADREQ * opcode</td> * </tr> * <tr> * <td>File ID</td> * <td>16</td> * <td> NA</td> * <td>The ID of the requested file</td> * </tr> * </tbody> * </table> */ public static Packet getUploadReuqestPacket(FileHash fileHash){ Packet packet=new StandardPacket(16); packet.setCommand(OP_SLOTREQUEST); packet.insertData(fileHash.getHash()); return packet; } /** * Request file parts packet. * @param fileHash hash of download file * @param partsData position of parts max 3, format <begin> <begin> <begin> <end> <end> <end> * @return * <table cellspacing="0" border="1" cellpadding="0"> * <thead> * <tr> * <th>Name</th> * <th>Size in bytes</th> * <th>Default value</th> * <th>Comment</th> * </tr> * </thead> * <tbody> * <tr> * <td>Protocol</td> * <td>1</td> * <td>0xE3</td> * <td>-</td> * </tr> * <tr> * <td>Size</td> * <td>4</td> * <td>-</td> * <td>The size of the message in bytes not including * the header and size fields * </td> * </tr> * <tr> * <td>Type</td> * <td>1</td> * <td>0x46</td> * <td>The value of the OP REQUESTPARTS opcode</td> * </tr> * <tr> * <td>File ID</td> * <td> 16</td> * <td> NA</td> * <td>A unique file ID calculated by hashing the * file's data * hash</td> * </tr> * <tr> * <td>Part 1 Start * offset</td> * <td>4</td> * <td>NA</td> * <td>Start offset of the part 1 in the file</td> * </tr> * <tr> * <td>Part 2 Start offset</td> * <td>4</td> * <td>NA</td> * <td> </td> * </tr> * <tr> * <td>Part 3 Start offset</td> * <td>4</td> * <td>NA</td> * <td> </td> * </tr> * <tr> * <td>Part 1 End offset * </td> * <td>4</td> * <td>NA</td> * <td>End offset of the part 1 in the file</td> * </tr> * <tr> * <td>Part 2 End offset</td> * <td>4</td> * <td>NA</td> * <td> </td> * </tr> * <tr> * <td>Part 3 End offset</td> * <td>4</td> * <td>NA</td> * <td> </td> * </tr> * </tbody> * </table> */ public static Packet getPeerRequestFileParts(FileHash fileHash, long... partsData){ int partCount=partsData.length; if (partCount % 2 == 0) { Packet packet = new StandardPacket( 16 + ( 8 * 3 ) ); packet.setCommand(OP_REQUESTPARTS); packet.insertData(fileHash.getHash()); ByteBuffer num = ByteBuffer.allocate(4); num.order(ByteOrder.LITTLE_ENDIAN); for ( int i = 0 ; i < partCount / 2 ; i++) { num.clear(); num.rewind(); num.putInt(Convert.longToInt(partsData[i]) ); packet.insertData( num.array() ); } for ( int i = partCount / 2 ; i < partCount ; i++) { num.clear(); num.rewind(); num.putInt( Convert.longToInt(partsData[i]) ); packet.insertData( num.array() ); } return packet; } else { return null; } } /** * Request hashes of parts. * @param fileHash file hash * @return request file hash packet * <table cellspacing="0" border="1" cellpadding="0">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -