【问题标题】:Client socket read "freezes"客户端套接字读取“冻结”
【发布时间】:2009-08-06 19:21:02
【问题描述】:

我想写一个简单的网络代理,以供练习。这是我到目前为止的代码:


def g = new Proxy()
g.serverPort = 9000
println "starting"
g.eachClient { Socket client ->
    println "got a client"
    try {
        client.withStreams { input,output ->
            String text = input.text
            println "received $text from client"
            client.close()
        }
    } catch(IOException io) {
        println "IO error. Probably client disconnected"
        //io.printStackTrace()
    }
}

问题是,这条线:

String text = input.text

消耗 Socket 的 InputStream 中的所有可用数据。如果客户端没有关闭连接,该方法将等到它可以读取文件结尾字符(如果我没记错的话)。我需要做些什么来防止这种情况发生,并尽快让客户的字符串可用?

【问题讨论】:

    标签: java sockets proxy groovy stream


    【解决方案1】:

    我认为您需要查看ObjectInputStream 上的文档。执行length = input.available 获取当前可用字节数,然后使用input.read(buffer, offset, length) 读取可用字节数。您可能希望为每个新连接启动一个新线程,该线程在后台透明地管理此缓冲区,除非您一开始就制作单线程代理。

    【讨论】:

    • 这成功了!谢谢!再问一个问题,java怎么知道有多少字节可用?
    • 这更多的是底层操作系统的套接字库的问题,Java 为您抽象出来。您可以在此处查看如何在 *nix 操作系统中使用 C 来执行此操作的示例:dholm.com/2008/05/13/available-socket-bytes
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多