【问题标题】:How to write the string data from user as byte array to socket如何将用户的字符串数据作为字节数组写入套接字
【发布时间】:2021-12-10 21:38:21
【问题描述】:

我有一个类接收用户发送的消息并将它们打印在终端上,但现在我正在尝试编写一个从用户那里读取数据的类,将来自用户的字符串数据转换为字节数组,并将字节数组写入套接字。

我正在尝试使用 BufferedReader 从用户读取数据并使用 OutputStream 将字节数组写入套接字,但由于某种原因,我正在写入套接字的消息没有传递到服务器。

BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
String newLine = r.readLine();
while (r.ready() && newLine != null) {

    // TODO: read data from the user, blocking until ready. Convert the
    //string data from the user into an array of bytes and write
    //the array of bytes to "socket".

    byte[] message = newLine.getBytes();
    OutputStream outputStream = s.getOutputStream();
    outputStream.write(message);
}

s 是与我发送它的服务器和端口号相同的套接字!

我运行它时没有错误,所以我真的不知道为什么它不会将消息发送到套接字。

【问题讨论】:

  • 你调试过你的代码吗? outputStream.write(message) 会被调用吗?您是否刷新流或至少关闭它?附带说明:不要使用getBytes(),因为这取决于系统的区域设置。而是使用getBytes(Charset) 并在客户端和服务器代码中传递相同的字符集。

标签: java sockets server


【解决方案1】:

String newLine = r.readLine();

也许你误解了java的工作原理;仅当您认为这设置了一种别名时,您的困惑才合乎逻辑:每次newLine 都被感动了,它只是r.readLine() 的简写。

Java 不是这样工作的。在这段代码中,您从r 中读取了一行恰好一次,从一开始就读到了,以后再也不会了。上面那行的意思是:此时执行r.readLine(),允许该方法将它得到的字符串放在内存中的某个位置,然后让newLine成为那个字符串的别名,而不是“从网络缓冲区中拉出另一个字符串”的一般概念。

r.readLine() 需要位于该循环中的某个位置。

更一般地说,不要打电话给.ready(),这没什么用。仅致电readLine()。调用它将“阻塞”直到数据自动可用,并在不再有数据到来时返回null(因为连接已关闭)。

【讨论】:

  • 扩展答案:r.ready() && newLine != null 可能总是正确的,即使没有新内容 - 这将导致无限循环,并且输出流的缺少刷新看起来像什么都没有写。相反,它应该是(newLine = r.readLine()) != null 或类似的东西。 :)
  • 非常感谢!!!有用!!!我收到了消息:))我感到非常迷茫和困惑,但现在一切都说得通了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2011-11-07
  • 2020-09-27
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多