Bufferedreader阻塞线程,但是如果(br.ready())停止断开检查则添加

时间:2013-12-12 18:45:36

标签: java multithreading sockets bufferedreader

我正在制作聊天服务器/客户端。我有一个BufferedReader从套接字读取我的输入流,当它.readLine()它阻塞。我添加了if(BufferedReader.ready()),但这意味着我无法再检测断开连接的客户端,就好像我确实添加了其他System.out.println(“客户端已断开连接”),然后每当客户端用户不发送消息时超过几毫秒,它假定用户已断开连接。 我怎么摆脱这个? 代码:

import java.io.BufferedReader;
import java.io.InputStream;
import java.net.Socket;

public class SpeechHandler implements Runnable {

public SpeechHandler (BufferedReader r, ServerMain sm, Socket soc) {

    try {

    boolean connected = true;

    while (connected) {

        try {

            String text = null;

            text = r.readLine();

            if (!text.equals(null)) {

                sm.tellAll(text);

            }

        } catch (Exception e) {

            System.out.println("Client " + soc.getInetAddress() + " has disconnected");
            sm.removeStream(soc.getInputStream());
            sm.removeStream(soc.getOutputStream());
            e.printStackTrace();
            connected = false;

        }

    }

    } catch (Exception e) {

        e.printStackTrace();

    }

}

@Override
public void run () {



}

}

找到答案问题不是读者阻塞线程,而是所有代码都是在构造函数中编写的,而不是run()方法,因为这意味着其他线程等待在继续之前完成的构造函数。

1 个答案:

答案 0 :(得分:0)

  

我有一个BufferedReader从套接字读取我的输入流,当它.readLine()时它会阻塞。

正确。这是指定的行为。

  

我添加了if(BufferedReader.ready()),但这意味着我无法再检测到断开连接的客户端

正确。 ready(),的正确使用方法很少,而且不是其中之一。

  

然后,只要客户端用户发送的消息超过几毫秒,就会假定用户已断开连接。

这是您代码中的错误。在'几毫秒'之后不要'推测'。

  

如何解决这个问题?

您正在使用阻止I / O.您应该专门用一个线程从套接字读取,并检测流的结束或异常以指示对等断开连接。