java - 缓冲区读取器意外行为

标签 java sockets bufferedreader serversocket printwriter

我正在尝试使用线程运行方法从套接字读取数据:

@Override
public void run() {
    while(true){
        try{
            String o = "";
            socketServer = new ServerSocket(port);
            System.out.println("Waiting for connection on port "+port+".");
            Socket socket = new Socket();
            socket = socketServer.accept();
            System.out.println("Connection got.");
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            int c;
            while(( c = input.read()) != -1)
                o += (char)c;
            PrintWriter output = new PrintWriter(socket.getOutputStream());
            output.println("ok");
            output.flush();
            output.close();
            input.close();
            socket.close();
            socketServer.close();
            textFieldMessage.setText("Сообщение от "+socket.getInetAddress().getCanonicalHostName()+":\n"+o);
        }catch(Exception e){
            e.printStackTrace();
            System.exit(-1);
        }

    }
}

但它卡在了 while 循环中。调试器告诉最后没有 -1 值。 这里有什么问题吗?

最佳答案

因为您是从套接字读取数据,所以除非套接字或流已关闭,否则您永远不会到达流的末尾。所以 while 循环将在 input.read() 上阻塞,因为它不会返回 -1,直到客户端关闭流/套接字。

不太确定您从套接字读取的是什么,但您可以尝试使用 BufferedReader 的 readLine() 方法。您可以提前知道需要阅读多少行,或者以一个空行结束阅读(如 HTTP)。

关于java - 缓冲区读取器意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12035477/

相关文章:

java - 确保套接字连接,无需控制底层协议(protocol)

java - 缓冲读取器错误

java - 如何从java中同一包中的另一个类访问变量

java - 如何使用 'for loop' 代替 'while loop'

Java - 不兼容的类型 : boolean cannot be converted to int

java - 在 Eclipse 中更新代号一

java - 循环和 BufferedReader 的问题

java - 如何将表与该表的实体类中 View 的一列连接起来

Java NIO 防止来自同一台 PC 的多个套接字连接

sockets - D套接字编程基本连接脚本