|
9 | 9 | import java.net.SocketAddress;
|
10 | 10 | import java.net.SocketException;
|
11 | 11 | import java.net.UnixDomainSocketAddress;
|
| 12 | +import java.nio.ByteBuffer; |
12 | 13 | import java.nio.channels.Channels;
|
| 14 | +import java.nio.channels.SelectionKey; |
| 15 | +import java.nio.channels.Selector; |
13 | 16 | import java.nio.channels.SocketChannel;
|
14 | 17 | import java.nio.file.Path;
|
15 | 18 |
|
@@ -118,7 +121,46 @@ public InputStream getInputStream() throws IOException {
|
118 | 121 | if (isInputShutdown()) {
|
119 | 122 | throw new SocketException("Socket input is shutdown");
|
120 | 123 | }
|
121 |
| - return Channels.newInputStream(unixSocketChannel); |
| 124 | + |
| 125 | + Selector selector = Selector.open(); |
| 126 | + unixSocketChannel.configureBlocking(false); |
| 127 | + unixSocketChannel.register(selector, SelectionKey.OP_READ); |
| 128 | + ByteBuffer buffer = ByteBuffer.allocate(256); // arbitrary buffer size for now |
| 129 | + |
| 130 | + try { |
| 131 | + if (selector.select(timeout) == 0) { |
| 132 | + System.out.println("Timeout (" + timeout + "ms) while waiting for data."); |
| 133 | + } |
| 134 | + for (SelectionKey key : selector.selectedKeys()) { |
| 135 | + if (key.isReadable()) { |
| 136 | + int r = unixSocketChannel.read(buffer); |
| 137 | + if (r == -1) { |
| 138 | + unixSocketChannel.close(); |
| 139 | + System.out.println("Not accepting client messages anymore."); |
| 140 | + } |
| 141 | + } |
| 142 | + } |
| 143 | + buffer.flip(); |
| 144 | + } finally { |
| 145 | + selector.close(); |
| 146 | + } |
| 147 | + |
| 148 | + return new InputStream() { |
| 149 | + @Override |
| 150 | + public int read() { |
| 151 | + return buffer.hasRemaining() ? (buffer.get() & 0xFF) : -1; |
| 152 | + } |
| 153 | + |
| 154 | + @Override |
| 155 | + public int read(byte[] bytes, int off, int len) { |
| 156 | + if (!buffer.hasRemaining()) { |
| 157 | + return -1; |
| 158 | + } |
| 159 | + len = Math.min(len, buffer.remaining()); |
| 160 | + buffer.get(bytes, off, len); |
| 161 | + return len; |
| 162 | + } |
| 163 | + }; |
122 | 164 | }
|
123 | 165 |
|
124 | 166 | @Override
|
|
0 commit comments