|
| 1 | +package libdaemonjvm |
| 2 | + |
| 3 | +import java.net.{ServerSocket, Socket} |
| 4 | +import java.nio.ByteBuffer |
| 5 | +import java.nio.channels.{Channels, ReadableByteChannel, ServerSocketChannel, SocketChannel} |
| 6 | + |
| 7 | +object Util { |
| 8 | + |
| 9 | + def socketFromChannel(channel: SocketChannel): Socket = |
| 10 | + new Socket { |
| 11 | + override def getInputStream() = |
| 12 | + Channels.newInputStream( |
| 13 | + // Passing a custom ReadableByteChannel rather than channel, |
| 14 | + // so that ChannelInputStream doesn't try to acquire the "blocking lock", |
| 15 | + // that's also acquired by output stream stuff below (which causes reads and |
| 16 | + // writes to block each other). |
| 17 | + new ReadableByteChannel { |
| 18 | + override def read(dst: ByteBuffer) = |
| 19 | + channel.read(dst) |
| 20 | + override def close() = |
| 21 | + channel.close() |
| 22 | + override def isOpen() = |
| 23 | + channel.isOpen() |
| 24 | + } |
| 25 | + ) |
| 26 | + override def getOutputStream() = |
| 27 | + Channels.newOutputStream(channel) |
| 28 | + // override def getLocalAddress() = |
| 29 | + // channel.getLocalAddress() |
| 30 | + override def isConnected() = |
| 31 | + channel.isConnected() |
| 32 | + override def getRemoteSocketAddress() = |
| 33 | + channel.getRemoteAddress() |
| 34 | + override def close() = |
| 35 | + channel.close() |
| 36 | + override def shutdownInput() = |
| 37 | + channel.shutdownInput() |
| 38 | + override def shutdownOutput() = |
| 39 | + channel.shutdownOutput() |
| 40 | + } |
| 41 | + |
| 42 | + def serverSocketFromChannel(serverChannel: ServerSocketChannel): ServerSocket = |
| 43 | + new ServerSocket { |
| 44 | + override def accept() = |
| 45 | + socketFromChannel(serverChannel.accept()) |
| 46 | + override def close() = |
| 47 | + serverChannel.close() |
| 48 | + override def getLocalPort() = -1 |
| 49 | + } |
| 50 | +} |
0 commit comments