8 import java.nio.ByteBuffer;
11 /** Class IoTSocket is the basic class for IoT RMI
12 * socket communication. This class will be extended
13 * by both IoTSocketServer and IoTSocketClient
15 * Adapted from Java/C++ socket implementation
17 * @see <a href="https://www.keithv.com/software/socket/</a>
19 * @author Rahmadi Trimananda <rtrimana @ uci.edu>
23 public abstract class IoTSocket {
28 protected byte data[];
30 protected Socket sock;
31 protected BufferedInputStream input;
32 protected BufferedOutputStream output;
37 //protected static int BUFFSIZE = 128000; // how many bytes our incoming buffer can hold (original)
38 protected static int BUFFSIZE = 8388608; // 8388608 = 2^23 bytes of memory (8MB) - this is required by our IHome speaker driver
39 protected static int MSG_LEN_SIZE = 4; // send length in the size of integer (4 bytes)
44 protected IoTSocket(int _port) throws IOException
47 data = new byte[BUFFSIZE];
52 * sendBytes() sends an array of bytes
54 public synchronized void sendBytes(byte vals[]) throws IOException
56 int len = vals.length;
57 // Write the length first - convert to array of 4 bytes
58 ByteBuffer bb = ByteBuffer.allocate(MSG_LEN_SIZE);
60 output.write(bb.array(), 0, MSG_LEN_SIZE);
62 // Write the byte array
63 output.write(vals, 0, len);
71 * receiveBytes() receives an array of bytes
73 public synchronized byte[] receiveBytes(byte val[]) throws IOException
79 // Wait until input is available
80 while(input.available() == 0);
81 // Read the maxlen first - read 4 bytes here
82 byte[] lenBytes = new byte[MSG_LEN_SIZE];
83 input.read(lenBytes, 0, MSG_LEN_SIZE);
84 int maxlen = ByteBuffer.wrap(lenBytes).getInt();
85 // Receive until maxlen
86 if (maxlen>BUFFSIZE) {
87 System.out.println("IoTSocketClient/Server: Sending more bytes then will fit in buffer! Number of bytes: " + maxlen);
89 val = new byte[maxlen];
90 while (totalbytes < maxlen)
92 numbytes = input.read(data);
93 // copy the bytes into the result buffer
94 for (i=totalbytes; i<totalbytes+numbytes; i++)
95 val[i] = data[i-totalbytes];
96 totalbytes += numbytes;
98 // we now send an acknowledgement to the server to let them
108 * Close socket connection
110 public synchronized void close() throws IOException
119 public synchronized void sendAck() throws IOException
131 public synchronized void receiveAck() throws IOException
134 ack = (int) input.read();