datapacket.java
来自「java语言开发的P2P流媒体系统」· Java 代码 · 共 167 行
JAVA
167 行
/* Stream-2-Stream - Peer to peer television and radio
* This file has been modified from the original P2P-Radio source
* Project homepage: http://s2s.sourceforge.net/
* Copyright (C) 2005-2006 Jason Hooks
*/
/*
* P2P-Radio - Peer to peer streaming system
* Project homepage: http://p2p-radio.sourceforge.net/
* Copyright (C) 2003-2004 Michael Kaufmann <hallo@michael-kaufmann.ch>
*
* ---------------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* ---------------------------------------------------------------------------
*/
package p2pradio.packets;
public class DataPacket extends StreamPacket
{
private long headerSeqNr;
private long metadataSeqNr;
// Die Daten werden nicht noch extra in einem
// eigenen Array gespeichert
private int dataOffset;
private int dataLength;
public DataPacket(long seqNr, long timeStamp, long headerSeqNr, long metadataSeqNr, byte data[])
{
this(new byte[getMaxLength() + data.length], seqNr, timeStamp, headerSeqNr, metadataSeqNr, data, 0, data.length);
}
public DataPacket(byte content[], long seqNr, long timeStamp, long headerSeqNr, long metadataSeqNr, byte[] data)
{
this(content, seqNr, timeStamp, headerSeqNr, metadataSeqNr, data, 0, data.length);
}
public DataPacket(long seqNr, long timeStamp, long headerSeqNr, long metadataSeqNr, byte data[], int dataLength)
{
this(new byte[getMaxLength() + dataLength], seqNr, timeStamp, headerSeqNr, metadataSeqNr, data, 0, dataLength);
}
public DataPacket(byte content[], long seqNr, long timeStamp, long headerSeqNr, long metadataSeqNr, byte[] data, int dataLength)
{
this(content, seqNr, timeStamp, headerSeqNr, metadataSeqNr, data, 0, dataLength);
}
public DataPacket(long seqNr, long timeStamp, long headerSeqNr, long metadataSeqNr, byte data[], int dataOffset, int dataLength)
{
this(new byte[getMaxLength() + dataLength], seqNr, timeStamp, headerSeqNr, metadataSeqNr, data, dataOffset, dataLength);
}
protected DataPacket(byte content[], long seqNr, long timeStamp, long headerSeqNr, long metadataSeqNr, byte[] data, int dataOffset, int dataLength)
{
super(Packet.DATA, content, seqNr, timeStamp);
// Header-Sequenznummer speichern
writeLong(headerSeqNr);
this.headerSeqNr = headerSeqNr;
// Metadaten-Sequenznummer speichern
writeLong(metadataSeqNr);
this.metadataSeqNr = metadataSeqNr;
// L鋘ge der Daten speichern
writeInt(dataLength);
this.dataOffset = offset;
this.dataLength = dataLength;
checkBytesLeft(dataLength);
// Daten kopieren
System.arraycopy(data, dataOffset, content, offset, dataLength);
offset += dataLength;
}
protected DataPacket(byte content[], int contentLength)
{
super(content, contentLength);
// Header-Sequenznummer lesen
headerSeqNr = readLong();
// Metadaten-Sequenznummer lesen
metadataSeqNr = readLong();
// L鋘ge der Daten lesen
int length = readInt();
checkBytesLeft(length);
dataOffset = offset;
dataLength = length;
offset += length;
}
// Die Methode getMaxLength() gibt hier nur eine
// Mindestl鋘ge zur點k
// Sie ist "public", weil sie von Source.java gebraucht wird
//jhooks NOTE - The following method does not get the actual max length of the packet!!!!!
//It returns the maxLength for the first part, which is required info such as timestamp, seqnr, headerSeqNr, MetadataSeqNr
//Most of this required info is used for keeping track of the packets in the Buffer.java
//This info is put together with the second part data[] (actual information you want to send) into a byte array content[];
//When the packet is sent, both parts (data and required info) are passed to the next peer
//The actual max length of a packet is TCP_MAX_MESSAGE_SIZE (10,000) in PacketFactory.java
public static int getMaxLength()
{
return StreamPacket.getMaxLength() + 8 + 8 + 4 + 4;
}
protected String getTypeString()
{
return "Data"; //$NON-NLS-1$
}
public long getHeaderSeqNr()
{
return headerSeqNr;
}
public long getMetadataSeqNr()
{
return metadataSeqNr;
}
public byte[] getData()
{
return content;
}
public int getDataOffset()
{
return dataOffset;
}
public int getDataLength()
{
return dataLength;
}
public byte[] createDataArray()
{
byte[] data = new byte[dataLength];
System.arraycopy(content, dataOffset, data, 0, dataLength);
return data;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?