java - 我可以将二进制文件添加到基于字符串的服务器消息队列吗?

标签 java file sockets

我有一个多线程客户端-服务器应用程序,它使用 Vector<String>作为queue of messages发送。

但是,我需要使用此应用程序发送文件。在 C++ 中我不会真正担心,但在 Java 中我在将任何内容转换为字符串时有点困惑。

Java 有 2 个字节字符。当你看到十六进制的 Java 字符串时,它通常是这样的:

00XX 00XX 00XX 00XX

除非存在某些 Unicode 字符。

Java 也使用 Big endian。

这些事实让我不确定是否以及最终如何将文件添加到队列中。文件的首选格式是:

-- Headers --
2 bytes  Size of the block (excluding header, which means first four bytes)
2 bytes  Data type (text message/file)
-- End of headers --
2 bytes  Internal file ID (to avoid referring by filenames)
2 bytes  Length of filename
X bytes  Filename
X bytes  Data

您可以看到我已经对所有数字使用了 2 个字节,以避免从一个字符中获取 2 个数字时所需的一些可怕的操作。

但我真的不知道如何正确添加文件数据。对于数字,我认为这样做可以:

StringBuilder packetData = new StringBuilder();
packetData.append((char) packetSize);
packetData.append((char) PacketType.BINARY.ordinal()); //Just convert enum constant to number

但是文件确实是个问题。如果我对 Java 数据类型的描述有任何错误,请纠正我 - 我是初学者。

最佳答案

是否必须只发送String?我认为如果确实如此,那么您确实需要使用 base64 或类似的方法对其进行编码。总体而言,最好的方法可能是将其作为原始字节发送。根据重构代码以支持字节数组而不仅仅是字符串的难度,这可能是值得做的。

为了回答我刚刚在评论中看到的 String 问题,String 上有一个 getBytes 方法。

有关套接字问题,请参阅: Java sending and receiving file (byte[]) over sockets

关于java - 我可以将二进制文件添加到基于字符串的服务器消息队列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23819786/

相关文章:

file - 编写大型文件管理脚本的最佳语言

c - 套接字编程头文件中使用的一段代码的解释

c++ - 如何从 struct sockaddr(不是路由器 IP)获取互联网 IP?

Java Spring 启动异步方法偶尔不会被调用

Java:我无法多次运行 JTextArea?

Java读取文本文件并搜索一行

arrays - 用两个字节表示音频样本的正确方法是什么?

c# - 如何在C#中获取套接字缓冲区大小

java - 流水线排程递归解决错误

java - 使用 group by 在 mysql 中选择计数并在每一行中重复计数