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[];
29 protected int localPort;
31 protected Socket sock;
32 protected BufferedInputStream input;
33 protected BufferedOutputStream output;
38 protected static int BUFFSIZE = 128000; // how many bytes our incoming buffer can hold (original)
39 //protected static int BUFFSIZE = 8388608; // 8388608 = 2^23 bytes of memory (8MB) - this is required by our IHome speaker driver
40 protected static int MSG_LEN_SIZE = 4; // send length in the size of integer (4 bytes)
45 protected IoTSocket(int _port) throws IOException
49 data = new byte[BUFFSIZE];
53 protected IoTSocket(int _localPort, int _port) throws IOException
55 localPort = _localPort;
57 data = new byte[BUFFSIZE];
62 * sendBytes() sends an array of bytes
64 public synchronized void sendBytes(byte vals[]) throws IOException
66 int len = vals.length;
67 // Write the length first - convert to array of 4 bytes
68 ByteBuffer bb = ByteBuffer.allocate(MSG_LEN_SIZE);
70 output.write(bb.array(), 0, MSG_LEN_SIZE);
72 // Write the byte array
73 output.write(vals, 0, len);
75 //System.out.println("Sender about to receive ACK!");
77 //System.out.println("Sender about to send ACK!\n\n");
83 * receiveBytes() receives an array of bytes
85 public synchronized byte[] receiveBytes(byte val[]) throws IOException
91 // Wait until input is available
92 // while(input.available() == 0);
93 if (input.available() == 0)
96 // Read the maxlen first - read 4 bytes here
97 byte[] lenBytes = new byte[MSG_LEN_SIZE];
98 input.read(lenBytes, 0, MSG_LEN_SIZE);
99 int maxlen = ByteBuffer.wrap(lenBytes).getInt();
100 // Receive until maxlen
101 if (maxlen>BUFFSIZE) {
102 System.out.println("IoTSocketClient/Server: Sending more bytes then will fit in buffer! Number of bytes: " + maxlen);
103 // Allocate a bigger array when needed
105 while (newLen < maxlen) // Shift until we get a new buffer size that's bigger than maxLen (basically power of 2)
106 newLen = newLen << 1;
107 System.out.println("IoTSocketClient/Server: Allocating a bigger buffer now with size: " + newLen);
109 data = new byte[BUFFSIZE];
111 val = new byte[maxlen];
112 while (totalbytes < maxlen)
114 numbytes = input.read(data);
115 // copy the bytes into the result buffer
116 for (i=totalbytes; i<totalbytes+numbytes; i++)
117 val[i] = data[i-totalbytes];
118 totalbytes += numbytes;
120 // we now send an acknowledgement to the server to let them
122 //System.out.println("Receiver about to send ACK!");
124 //System.out.println("Receiver about to receive ACK!\n\n");
132 * Close socket connection
134 public void close() throws IOException
143 public synchronized void sendAck() throws IOException
155 public synchronized void receiveAck() throws IOException
158 ack = (int) input.read();
165 public void setSoTimeout(int timeout) throws SocketException {
167 sock.setSoTimeout(timeout);