我正在尝试创建一个小型HTTP代理,可以根据需要重新编写请求/标头。如果已经存在,请指出我。否则...
我写过ALMOST的作品。它可以执行代理功能,但不能重写(尚未)。问题是,我无法检测远程套接字何时关闭而未进行阻塞读取。对于这个东西的功能而言,它能够检测到没有阻塞的套接字是至关重要的。我已经SCOURED Java API文档,我找不到任何迹象表明它甚至是可能的。这就是我所拥有的:
while ( this.inbound.isConnected() && this.outbound.isConnected() ) {
try {
while ( ( available = readFromClient.available() ) != 0 ) {
if ( available > 1024 ) available = 1024
bytesRead = readFromClient.read( buffer, 0, available )
writeToServer.write( buffer, 0, bytesRead )
}
while ( ( available = readFromServer.available() ) != 0 ) {
if ( available > 1024 ) available = 1024
bytesRead = readFromServer.read( buffer, 0, available )
writeToClient.write( buffer, 0, bytesRead )
}
} catch (e) {
print e
}
println "Connected: " + this.inbound.isConnected()
println "Bound: " + this.inbound.isBound()
println "InputShutdown: " + this.inbound.isInputShutdown()
println "OutputShutdown: " + this.inbound.isOutputShutdown()
print "\n";
Thread.sleep( 10 )
}
关闭套接字的测试从不表示套接字已关闭。并且,正如我所提到的,我找不到任何关于如何在不进行阻塞读取的情况下检测流上的“END OF FILE”条件的示例。
有一种方法。这里有人知道它是什么吗?
答案 0 :(得分:2)
我假设您正在使用java.net.Socket
进行I / O操作。为了在Java中执行非阻塞I / O,您必须使用NIO包。
特别是,您需要使用java.nio.channels.SocketChannel
进行通信。在通道上调用configureBlocking(false)
,然后read()将返回读取的数据量,-1表示关闭,如果没有数据可用,则返回零。某些错误条件也可能会引发异常。
这是example显示使用SocketChannel的非阻塞I / O.
答案 1 :(得分:0)
不,这没有帮助。如果连接在另一端关闭,你怎么能知道你应该读取,并且当发生这种情况时,java nio选择器不会将通道置于就绪集中?
据我所知,它刚刚被设计破坏了,而且没有办法做到这一点。如果我弄错了,请有人纠正我......