Subversion Repositories programming

Rev

Rev 215 | Rev 218 | Go to most recent revision | Details | Compare with Previous | 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
 
215 ira 22
    // Fake an enum
23
    public static final byte DROP = 0;
24
    public static final byte TRANSREQ = 1;
25
    public static final byte TRANSREPL = 2;
26
    public static final byte QUIT = 3;
27
    public static final byte BADPACKET = 4;
28
 
214 ira 29
    /**
30
     * Packet Format:
31
     * 1 byte: packetBegin
32
     * 1 byte: packetType
33
     * 1 byte: packetNumber
34
     * 1 byte: packetDataSize
35
     * packetDataSize bytes: data
36
     * 1 byte: packetEnd
37
     */
38
 
39
    /**
40
     * Method: P2_Packet constructor
41
     * Purpose: Construct a P2_Packet given the type and data
42
     */
43
    public P2_Packet (byte type, byte[] data)
44
    {
45
        byte[] p = P2_Packet.createPacket(type, data);
46
        P2_Packet pp = new P2_Packet (p);
47
 
48
        packetType = pp.packetType;
49
        packetNumber = pp.packetNumber;
50
        packetDataSize = pp.packetDataSize;
51
        packetData = pp.packetData;
52
    }
53
 
54
    /**
55
     * Method: P2_Packet constructor
56
     * Purpose: Construct a P2_Packet from a byte[].
57
     * Note: Checks to make sure the byte[] is a valid packet.
58
     */
59
    public P2_Packet (byte[] bytes)
60
    {
61
        int i;
62
 
63
        if (bytes.length < 5)
64
            throw new IllegalArgumentException(); // Definitely a bad packet
65
 
66
        if (bytes[0] != packetBegin)
67
            throw new IllegalArgumentException(); // Definitely a bad packet
68
 
69
        packetType     = bytes[1];
70
        packetNumber   = bytes[2];
71
        packetDataSize = bytes[3];
72
        packetData = new byte[packetDataSize];
73
 
74
        for (i=0; i<packetDataSize; i++)
75
            packetData[i] = bytes[i+4];
76
 
77
        if (bytes[i+4] != packetEnd)
78
            throw new IllegalArgumentException(); // Definitely a bad packet
79
    }
80
 
81
    /**
82
     * Method: createPacket()
83
     * Purpose: Create a packet suitable for transmission over the network,
84
     * using the current values of this class.
85
     */
86
    public byte[] createPacket ()
87
    {
88
        return P2_Packet.createPacket (packetType, packetData);
89
    }
90
 
91
    /**
92
     * Method: createPacket()
93
     * Purpose: Create a packet suitable for sending over the network,
94
     * using the parameters passed in.
95
     */
96
    public static byte[] createPacket (byte type, byte[] data)
97
    {
98
        int i;
99
        byte[] packet = new byte[data.length+5];
100
 
101
        packet[0] = packetBegin;
102
        packet[1] = type;
103
        packet[2] = ++lastPacketNum;
104
        packet[3] = (byte)data.length;
105
 
106
        for (i=0; i<data.length; i++)
107
            packet[i+4] = data[i];
108
 
109
        packet[i+4] = packetEnd;
110
 
111
        return packet;
112
    }
113
 
216 ira 114
    public static byte[] createPacket (byte type, byte[] data, int packetNum)
115
    {
116
        int i;
117
        byte[] packet = new byte[data.length+5];
118
 
119
        packet[0] = packetBegin;
120
        packet[1] = type;
121
        packet[2] = (byte)packetNum;
122
        packet[3] = (byte)data.length;
123
 
124
        for (i=0; i<data.length; i++)
125
            packet[i+4] = data[i];
126
 
127
        packet[i+4] = packetEnd;
128
 
129
        return packet;
130
    }
131
 
214 ira 132
    /**
133
     * Method: toString()
134
     * Purpose: Convert a P2_Packet into a string for printing by a
135
     * PrintStream object.
136
     */
137
    public String toString ()
138
    {
139
        int i;
140
        String s;
141
 
142
        s = new String (    "packetBegin: " + packetBegin + "\n");
143
        s = new String (s + "packetType: " + packetType + "\n");
144
        s = new String (s + "packetNumber: " + packetNumber + "\n");
145
        s = new String (s + "packetDataSize: " + packetDataSize + "\n");
146
        s = new String (s + "packetData: ");
147
 
148
        for (i=0; i<packetDataSize; i++)
149
            s = new String (s + packetData[i]+ " ");
150
 
151
        s = new String (s + "\n");
152
        s = new String (s + "packetEnd: " + packetEnd);
153
 
154
        return s;
155
    }
156
 
157
    /**
158
     * Method: getter methods
159
     * Purpose: get access to private fields
160
     */
161
    public byte getPacketType () { return packetType; }
162
    public byte getPacketNumber () { return packetNumber; }
163
    public byte getPacketDataSize () { return packetDataSize; }
164
    public byte[] getPacketData () { return packetData; }
165
}
166