Skip to content

Commit bb56bb3

Browse files
Add helpers to convert channels to java.net.*Socket
1 parent 6583661 commit bb56bb3

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

library/src/libdaemonjvm/Util.scala

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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

Comments
 (0)