Subversion Repositories programming

Rev

Rev 215 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
214 ira 1
/*******************************************************************************
2
 * File: P2_Packet.java
3
 * Author: Ira W. Snyder (devel@irasnyder.com)
4
 * Class: CS380 - Computer Networking
5
 *
6
 * Assignment: Project #2
7
 * Date Last Modified: 2006-02-06
8
 *
9
 * Purpose: Create and Decode packets for the P2_Server and P2_Client.
10
 * ****************************************************************************/
11
 
12
class P2_Packet
13
{
14
    private static final byte packetBegin = (byte)0xaa; // 0b10101010
15
    private static final byte packetEnd   = (byte)0x55; // 0b01010101
16
    private byte packetType;
17
    private byte packetNumber;
18
    private byte packetDataSize;
19
    private byte[] packetData;
20
    private static byte lastPacketNum = -1;
21
 
22
    /**
23
     * Packet Format:
24
     * 1 byte: packetBegin
25
     * 1 byte: packetType
26
     * 1 byte: packetNumber
27
     * 1 byte: packetDataSize
28
     * packetDataSize bytes: data
29
     * 1 byte: packetEnd
30
     */
31
 
32
    /**
33
     * Packet Types:
34
     * 0: DROP packet, data contains a single byte telling how often to drop
35
     * 1: TRANSLATE packet, data contains 4 bytes to translate to 5B encoding
36
     * 2: REPLY packet, data contains 5 bytes of 5B encoded data
37
     * 3: QUIT packet, data contains 0 bytes of data
38
     */
39
 
40
    /**
41
     * Method: P2_Packet constructor
42
     * Purpose: Construct a P2_Packet given the type and data
43
     */
44
    public P2_Packet (byte type, byte[] data)
45
    {
46
        byte[] p = P2_Packet.createPacket(type, data);
47
        P2_Packet pp = new P2_Packet (p);
48
 
49
        packetType = pp.packetType;
50
        packetNumber = pp.packetNumber;
51
        packetDataSize = pp.packetDataSize;
52
        packetData = pp.packetData;
53
    }
54
 
55
    /**
56
     * Method: P2_Packet constructor
57
     * Purpose: Construct a P2_Packet from a byte[].
58
     * Note: Checks to make sure the byte[] is a valid packet.
59
     */
60
    public P2_Packet (byte[] bytes)
61
    {
62
        int i;
63
 
64
        if (bytes.length < 5)
65
            throw new IllegalArgumentException(); // Definitely a bad packet
66
 
67
        if (bytes[0] != packetBegin)
68
            throw new IllegalArgumentException(); // Definitely a bad packet
69
 
70
        packetType     = bytes[1];
71
        packetNumber   = bytes[2];
72
        packetDataSize = bytes[3];
73
        packetData = new byte[packetDataSize];
74
 
75
        for (i=0; i<packetDataSize; i++)
76
            packetData[i] = bytes[i+4];
77
 
78
        if (bytes[i+4] != packetEnd)
79
            throw new IllegalArgumentException(); // Definitely a bad packet
80
    }
81
 
82
    /**
83
     * Method: createPacket()
84
     * Purpose: Create a packet suitable for transmission over the network,
85
     * using the current values of this class.
86
     */
87
    public byte[] createPacket ()
88
    {
89
        return P2_Packet.createPacket (packetType, packetData);
90
    }
91
 
92
    /**
93
     * Method: createPacket()
94
     * Purpose: Create a packet suitable for sending over the network,
95
     * using the parameters passed in.
96
     */
97
    public static byte[] createPacket (byte type, byte[] data)
98
    {
99
        int i;
100
        byte[] packet = new byte[data.length+5];
101
 
102
        packet[0] = packetBegin;
103
        packet[1] = type;
104
        packet[2] = ++lastPacketNum;
105
        packet[3] = (byte)data.length;
106
 
107
        for (i=0; i<data.length; i++)
108
            packet[i+4] = data[i];
109
 
110
        packet[i+4] = packetEnd;
111
 
112
        return packet;
113
    }
114
 
115
    /**
116
     * Method: toString()
117
     * Purpose: Convert a P2_Packet into a string for printing by a
118
     * PrintStream object.
119
     */
120
    public String toString ()
121
    {
122
        int i;
123
        String s;
124
 
125
        s = new String (    "packetBegin: " + packetBegin + "\n");
126
        s = new String (s + "packetType: " + packetType + "\n");
127
        s = new String (s + "packetNumber: " + packetNumber + "\n");
128
        s = new String (s + "packetDataSize: " + packetDataSize + "\n");
129
        s = new String (s + "packetData: ");
130
 
131
        for (i=0; i<packetDataSize; i++)
132
            s = new String (s + packetData[i]+ " ");
133
 
134
        s = new String (s + "\n");
135
        s = new String (s + "packetEnd: " + packetEnd);
136
 
137
        return s;
138
    }
139
 
140
    /**
141
     * Method: getter methods
142
     * Purpose: get access to private fields
143
     */
144
    public byte getPacketType () { return packetType; }
145
    public byte getPacketNumber () { return packetNumber; }
146
    public byte getPacketDataSize () { return packetDataSize; }
147
    public byte[] getPacketData () { return packetData; }
148
}
149