如果客户端只是连接并且不发送任何数据,我的服务器将冻结

时间:2012-07-10 17:44:09

标签: java tcp-ip

我正在努力让我的服务器更稳定。它使用服务器套接字和套接字类。信息的传输是使用流类完成的。

我注意到有时候调试会在一段时间内释放每一盎司。

我发现id我的客户端刚刚进行套接字连接并且没有发送过数据,或者服务器期望服务器会冻结类InputStream的read方法。

有没有办法让read方法超时?该文件没有谈及时间噘嘴,但确实说它会阻止信息数据和蔼可亲。

如果读取不能超时,是否有另一种方法通过套接字连接读取数据,如果客户端不再发送数据则不冻结????

数据读取的代码段以及冻结的位置

public String ReadLine(){
    String out="";

    // read in one line
    try{
        request = new StringBuffer(1000);
        boolean f=true;
        while(true){
            int c=in.read(); // WILL FREEZ HEAR IF CLIENT NO LONGER CONNECTED OR SENDING DATA
            if (c=='\r'){
                // next should be a \n
                c=in.read(); 

    //.....

3 个答案:

答案 0 :(得分:0)

请发布您的完整代码,但如果您使用的是InputStream,则它是一种阻止I / O方法,只要您的客户端连接到它,它就会“冻结”。如果删除客户端连接,则应释放该块。您应该创建一个单独的线程来处理I / O,而不是对此自己有所了解。此外,真正的问题应该是,为什么客户端不发送消息?

答案 1 :(得分:0)

你能试试......

int c = 0;
while((c = in.read()) != -1) {
...
}

并查看它是否解决了问题。

答案 2 :(得分:0)

如果使用套接字,则需要在套接字上设置SO_TIMEOUT值。这将允许读取超时并抛出InterruptedIOException

Socket.setSoTimeout是要查看的方法。请注意,超时是在套接字本身上设置的,而不是在从套接字获得的输入流上设置的。