BufferedReader 在 read() 处阻塞

2024-03-17

我试图创建一个简单的聊天程序,带有“服务器”和客户端,现在我的问题是程序在从服务器读取消息到客户端时阻塞,反之亦然。此示例解决了从客户端到服务器的消息问题。

我在服务器端的示例:

private Reader input;
private Writer output;

try {

        server = new ServerSocket(this.port);

        while (true) {

            Socket connection = server.accept();

            serverDisplay("We have a connection");

            input = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            output = new BufferedWriter(new OutputStreamWriter(
                    connection.getOutputStream()));

            int c;
            StringBuffer sb = new StringBuffer();

            // This is where it blocks, the input stream should return -1 at the end of the
            // stream and break the loop, but it doesnt
            while ((c = input.read()) != -1) {
                sb.append((char) c);
            }
            serverDisplay(sb.toString());
        }

    } catch (IOException e) {
        System.out.println("IO ex in the server");
    }

为了在客户端发送消息,我有以下代码:

output = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));

and

private void sendMessage(String message) {
    displayMessage(message);

    try {
        output.write(message);
        output.flush();
    } catch (IOException e) {
        System.out.println("IO ex at sendMessage client");
    }

}

它读取我发送的所有字符(从客户端到服务器;通过 Sys out 确认)但是当它应该读取流的末尾(-1)时,它挂在那里.

我试图在 while 循环内打印“c”以查看它返回的值,它根本不进入循环,也不会破坏它,它只是挂在那里。

我知道已经有一些与该主题相关的问题,但我还没有在其中任何一个中找到解决我的问题的方法。

奇怪的是(至少对我来说)if I use:

output = new ObjectOutputStream(connection.getOutputStream());
input = new ObjectInputStream(connection.getInputStream());

and:

while ((message = (String) input.readObject()) != null)

代替:

input = new BufferedReader(new InputStreamReader(connection.getInputStream()));
output = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));

And:

while ((c = input.read()) != -1) 

洞的东西有效。然而,这不是我想要的方式,通过阅读 BufferedReader/Writer、Input/OutputStreamWriter 的 API,我认为我的代码应该可以工作。

先感谢您。


在发送流(或整个套接字)关闭之前,不会到达接收端的流末尾。

output.close()发送端将导致接收端看到流结束。

如果您需要将流用于多个消息,则需要在应用程序协议中引入帧结构,以便接收者可以确定消息边界。这可以很简单,只需在每条消息中添加消息长度(以字节为单位)即可。

因为您使用字符串作为整个消息。您可以使用DataInputStream http://docs.oracle.com/javase/7/docs/api/java/io/DataInputStream.html and DataOutputStream http://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html流装饰器为您构建消息readUTF() and writeUTF(String). writeUTF(String)基本上通过在写入字符串之前将其长度写入流来构建字符串。readUTF()然后读取这个长度,然后知道在返回之前需要从流中读取多少数据。

Example:

Output:

DataOutputStream output = new DataOutputStream(connection.getOutputStream());

private void sendMessage(String message) {
    displayMessage(message);

    try {
        output.writeUTF(message);
        output.flush();
    } catch (IOException e) {
        System.out.println("IO ex at sendMessage client");
    }

}

Input:

DataInputStream input = new DataInputStream(connection.getInputStream());

String message = input.readUTF();

serverDispaly(message);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BufferedReader 在 read() 处阻塞 的相关文章

随机推荐

  • 是否有类似于 C++ 中的 std::bitset 的内置位集?

    我想在 Python 中使用一个位数组 我可以像 C 中的标准位集一样使用它 例子 include
  • Lua解释器相当于Matlab“whos”命令吗?

    Octave Matlab IPython whos 命令的 Lua 等价物是什么 我正在尝试以交互方式学习 Lua 并想看看当前定义了哪些变量 Lua 中的所有全局变量都驻留在可用作全局变量的表中 G http www lua org m
  • 作业的右侧是否总是在作业之前评估?

    这是一个代码片段 x x 1 len x print x 1 0 这是明确定义的吗 也就是说 可以x 1 1 反而 因为我记得 C 98 中有一个等效程序 如果我们使用std map 具有未定义的行为 使用VS编译器和G 编译时 程序的输出
  • 如何通过 AWS Lambda 使用 pysftp 连接 EC2,无需 .pem 文件或替代 .pem 文件

    我想通过 AWS Lambda 使用 pysftp 库连接 EC2 我使用下面的代码进行连接 mysftp pysftp Connection host Constants MY HOST NAME username Constants M
  • Visual Studio C++ 中 /MD 和 /DMD 有什么区别?

    c c gt 代码生成中 MD和 MDD 多线程调试dll 之间有什么区别 视觉工作室的属性 它们指定要使用哪个运行时 两者都使用多线程动态 DLL 运行时 但 MDD 版本使用调试版本 并且还为您定义了 DEBUG 符号 看这个 MSDN
  • 使用强命名程序集进行插件安全吗?

    我正在寻找一种方法来防止未知方将他们自己的包含恶意代码的插件附加到我的应用程序中 我偶然发现了这篇文章 NET 程序集插件安全性 https stackoverflow com q 932339 1462656 它建议对程序集进行强命名 并
  • next.js 和 mongodb atlas - 收到“配置限制的连接百分比已超过 80”警报

    我在 MongoDB Atlas 上看到了很多关于此警报的帖子和文章 配置限制的连接百分比已超过 80 但不知道如何在我的 Next js 应用程序中解决它 我在处理程序函数之外创建数据库连接 我使用了中间件withDatabase js
  • 在phonegap中打开软键盘时,showkeyboard/hidekeyboard事件不会在ios 7上触发

    我有一段非常简单的代码 只是为了尝试在软键盘打开时发出警报 我只是想证明这是显示键盘打开的可行方法 document addEventListener deviceready function app deviceReady documen
  • 用于 RSSI 距离近似的卡尔曼滤波器

    我目前正在开发一个项目 该项目利用 RSSI 信号来确定用户与三个信标之间的距离 虽然我有粗略的三角测量公式 但我正在努力使一些东西更加准确 通过我所有的研究 我发现了卡尔曼滤波器 从我读到的有关它们的内容来看 它们似乎正是我想要使用的 然
  • Android 手机通话流

    Android 是否可以在发送电话数据之前对其进行实时操作 例如 通过创建一个缓冲区来记录语音然后发送 或者它是否不可访问 并且必须始终是 实时 抱歉 没有 Android 应用程序不支持通过电话与音频流交互的方式
  • Javascript:更改复选框上的标签背景颜色

    我试图根据复选框的选中 未选中状态更改表单中每个复选框中标签的背景颜色 到目前为止 我最初更改了它 但当我取消选中时它不会变回来 http jsfiddle net 7wnCL 4 http jsfiddle net 7wnCL 4 jav
  • 同步和异步通信到底如何工作

    我试图理解术语同步和异步通信 但我有点困惑 我试着深入研究一下this https stackoverflow com questions 1596589 why are asynchronous processes not called
  • Java 脚本无法在 html 电子邮件模板中运行

    我有一个场景 我需要使用 c 发送电子邮件 这可以使用 SMTP 轻松完成 但挑战是将 Web 服务合并到 html 邮件中 因此我在邮件正文中使用了 java 脚本来访问 Web 服务发出按钮点击声 作为一个 html 网页 它工作得很好
  • 以编程方式更改过期的 Oracle 数据库密码?

    在我工作的地方 一些数据库会从生产环境复制到测试环境 但 DBA 在复制后立即将 新 测试数据库上的所有密码设置为过期 以便不知道生产密码 因此 如果我运行 sqlplus 并使用特定用户名连接到测试数据库 它会立即提示我输入新密码 有没有
  • 使用 RDCOMClient 通过 R 中的 Outlook 发送电子邮件附件

    我正在运行每日分析 生成一个我想通过我的 Outlook 电子邮件发送的文件 我使用的代码在这里 并且工作得很好 但它的附件部分从来没有工作过 library RDCOMClient OutApp lt COMCreate Outlook
  • 增加 Windows 上的堆栈大小 (GCC)

    有没有办法在使用 GCC 编译 链接时增加 Windows 应用程序的堆栈大小 IIRC 在 GCC 中 您可以向 ld 提供 stack bytes 参数 E g gcc Wl stack 16777216 o file exe file
  • Grails 外部配置。无法访问外部变量。总是[:]

    我无法让 文件夹 外部变量工作 我总是得到 我正在 Windows 下使用 Grails 进行开发 这就是为什么外部配置文件看起来像 file C path to file 我在另一个项目中使用外部配置没有问题 与下面显示的方式相同 我有这
  • 基于数组项获取集合给出“FAILED_PRECONDITION:查询需要索引”[重复]

    这个问题在这里已经有答案了 我试图获取所有具有 数学 标签的问题 但它没有成功 而是转移到失败的监听器 db collection questionCollection orderBy questionID Query Direction
  • 如何从 SQuirreL SQL 调用带有 OUT 参数的 DB2 存储过程?

    我真的很喜欢 SQuirreL SQL 作为 SQL 查询工具 但我一直无法让它调用我们的 AS 400 DB2 数据库中的存储过程 我总是收到错误 设置或注册的参数值的数量与参数的数量不匹配 我已经仔细检查了参数的数量 但没有运气 这是我
  • BufferedReader 在 read() 处阻塞

    我试图创建一个简单的聊天程序 带有 服务器 和客户端 现在我的问题是程序在从服务器读取消息到客户端时阻塞 反之亦然 此示例解决了从客户端到服务器的消息问题 我在服务器端的示例 private Reader input private Wri